LINUX.ORG.RU

Final Холивар

 ,


0

3

Всем хорошей пятницы!

Разгорелся у нас тут спор по поводу ключевого слова final и его использования в объявлении переменных в методах.

Например:

void method() {
        final List<String> lst = new ArrayList<>();
        final Item item = create();
        /**
         * Do some work
         */
    }

Лично я считаю, что лучше с final писать. Коллега же считает, что в таких случаях final лишь замусоривает код и излишен. С другой стороны, тот же Блох советует все же их писать. Однако, если посмотреть на многие библиотеки, например, в Apache - там такой подход не применяется.

Речь идет именно о final в объявлении локальных переменных.

В общем, опрос такой: используете ли вы такой стиль?

Мне было бы интересно узнать ваше мнение!


Ответ на: комментарий от korvin_

То, что ты описал в Obj-C не является «элегантным решением на уровне языка», а просто библиотекой классов.

Ладно, согласен, Obj-C плохой пример, там семантика такая же. Но в NS хоть как-то попытались решить проблему мутабельности. В жаве же все кушают стандартную библиотеку, колются и плачут с таких-вот рекомендаций:

public Date getDate() {
    return new Date(this.date.getTime());
}

Чо там в жаве иммутабельное в стандартной библиотеке, только String?

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Класс, объявленный, объявленный с модификатором 'final' не может иметь подклассов.

добавить к этому то что в джаве это реализовано как const(аналог) тоесть ВМ джавы даже обработчику мусора делает спец правило что этот клас финал вообще можно не трогать и убирать его уже просто в конце

простейшая конструкция класса экономящая мощности и память(простейшая своей логикой внутри ВМ)

lwx51033
()
Ответ на: комментарий от lwx51033

реализовано как const(аналог)

и так же как const, учитывается только на этапе компиляции

не пори чушь, ей больно

anonymous
()
Ответ на: комментарий от robotron5

У тебя так руки дрожали, чтобы быстрее что-то написать, что ты странно сформулировал последнее предложение.

Если ты - компетентный баран - то объясни, зачем ввели final(раз уж ты знаешь) и как его применять в конкретном случае с локальными переменными.

aarexer
() автор топика
Ответ на: комментарий от aarexer

Я тебе уже сказал в какую сторону капать, но тебе идиоту нужно разжевать и в рот положить, ты лучше на форумах поспрашивай)

robotron5
()
Ответ на: комментарий от robotron5

Вбросил - и слился, очень сильный мув. Такое впечатление, что ты сам где-то что-то слышал и решил выпендриться.

aarexer
() автор топика

Лучше final.

При разработке GWT/GXT (вызов RCP из клиента) среда (Eclipse, IDEA) может «пропустисть» при наборе текста переменную, не объявленную, как final, а при компиляции будет выдана ошибка.

Bioreactor ★★★★★
()
Последнее исправление: Bioreactor (всего исправлений: 1)
Ответ на: комментарий от Leron

почему-то переменные по умолчанию не константные
переменные
не константные

Почитай что написал ещё раз

FeyFre ★★★★
()
Ответ на: комментарий от robotron5

... ты лучше на форумах поспрашивай)

Если у тебя не хватило ума понять, что ЛОР это ФОРУМ, ... Кхм. Что стоят твои высказывания после этого?

anonymous
()

Самое общее, что можно сказать по теме: Mutability Matrix of Pain

(презентация http://www.slideshare.net/JAXLondon_Conference/the-java-memory-model-and-the-...).

Конкретно о локальных иммутабельных ссылках - поставить final ничего не стоит, но 1 раз из 1000 спасет от случайного провала, который потом придется дебажить или вообще боком вылезет. Так что я ставил, когда на джаве писал.

cdshines ★★★★★
()
Ответ на: комментарий от robotron5

А что, там что-то написано про то, как избежать случайного переприсвоения локальной переменной?

cdshines ★★★★★
()
Ответ на: комментарий от Dendy

В 8 весь java.time.* иммутабельный. Ну и куча остального. Не все так катастрофично :)

cdshines ★★★★★
()
Ответ на: комментарий от robotron5

Балбес, речь не об этом, ты просто заскочил в тред нерелевантно поумничать, уходи.

(Если ты не понял, то ты говоришь о JLS 17.5 (Final field semantics), а тред - о локальных переменных. Дальше давай на самостоятельной работе)

cdshines ★★★★★
()
Ответ на: комментарий от anonymous

В C, C++ то же самое.

Раньше писал const везде где дотянусь, потом стало ясно что толку от него в этом контексте нет

Строго говоря, const помогает в получении более оптимального кода. Работает правило: чем больше у компилятора данных о работе программы до её выполнения, тем оптимальнее код на выходе.

DarkAmateur ★★★★
()
Последнее исправление: DarkAmateur (всего исправлений: 1)
Ответ на: комментарий от php-coder

Да, не посмотрел - мы тоже каким-то форком пользовались, когда такое применялось.

aarexer
() автор топика

Жавы вот не знаю, но в шарпе везде постоянно надо указывать на иммутабельность: для свойств - геттер, для полей - readonly, локальных переменных - const, а запечатанных классов - sealed. Я бы не сказал, что это замусоривает код и делает его менее читаемым, даже наоборот. Решарпер везде указывает на то, что что-то можно сделать иммутабельным. Это очень удобно. Вот раз в жаве везде ключевое слово final, что, руки отваляться его написать?

nikolnik ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.