LINUX.ORG.RU

А у меня другой вопрос по java: стоит ли повсеместно использовать final для аргументов метода, которые не должны изменяться? В C++, например, рекомендуют использовать const, а в стандартной библилотеке java я этого не заметил.

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

>> стоит ли повсеместно использовать final для аргументов метода

Если компилятор не требует, то имхо нафиг не нужно.

cathode
()

>> есть ли в в Java виртуальные функции

Кхм... Есть. Они там все виртуальные из коробки...

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

> А у меня другой вопрос по java: стоит ли повсеместно использовать final для аргументов метода, которые не должны изменяться? В C++, например, рекомендуют использовать const, а в стандартной библилотеке java я этого не заметил.

В C++ имеет смысл объявлять аргумет как const T *arg или const T &arg. Но нет смысла писать const T arg: здесь const ничего не меняет. В яве такого обилия вариантов нет. Фактически там аргументы передаются как T &arg, но без возможности сделать arg=boo. Поэтому имеет смысл писать final SomeClass arg, но писать final int arg смысла нет.

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

>> стоит ли повсеместно использовать final для аргументов метода

> Если компилятор не требует, то имхо нафиг не нужно.

Компилятор много чего не требует... Зато, преодолев лень и дописав ненужное слово, можно получить аж два профита: защиту от своих же ошибок, когда зачем-то изменяешь объект, который не задумывалось изменять, и дополнительную возможность оптимизации: при вызове метода компилятор может рассчитывать, что объект-параметр не изменится (не уверен про яву, в плюсах это работает... ну и да, компилятор виноват, что не делает глобальную IPO, это хорошее оправдание лени).

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

>Поэтому имеет смысл писать final SomeClass arg...

Много где написано что имеет, но javap упорно не торопиться подтвердить сказанное... Может натыкались на обратное?

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

Разобрался. В плюсах, для const-аргументов, которые являются объектами, нельзя вызывать non-const методы. А в java, действительно, только прямое присваивание запрещается.

И, для сравнения:
c++ std::vector: void push_back ( const T& x )
java.util.ArrayList: public boolean add(E e)

Видимо, final не нужен.

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

>> при вызове метода компилятор может рассчитывать, что объект-параметр не изменится

Единственное, на что может рассчитывать компилятор в этом случае, это то, что не будет param = new SomeClass(), но ни как ни то, что объект не изменит свое состояние. В чем тут профит оптимизации пока не понятно.

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

>А у меня другой вопрос по java: стоит ли повсеместно использовать final для аргументов метода, которые не должны изменяться?

Теоретически final - аргументы можно выгоднее заJIT'ить, но практически вряд ли. Хотя Джошуа Блох и говорил где-то что это хорошая подсказка для HotSpot-а сами сановцы в своем JDK используют final только там где без него не компилируется, то есть для доступа к локальным переменным охватывающей функции из анонимного класса.

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

>> Фактически там аргументы передаются как T &arg

Фактически как T *arg для не примитивов и с возможность сделать arg=boo.

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

>> это хорошая подсказка для HotSpot-а

Объясни мне тупому, как можно это заоптимизировать. Честно, в упор не вижу, хотя был бы рад узнать.

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

> А в java, действительно, только прямое присваивание запрещается.

> В чем тут профит оптимизации пока не понятно.

Согласен, этот момент я проглядел. Если в яве final запрещает изменять переменную (aka ссылку на объект), а не сам объект, то ничего тут особо не наоптимизируешь.

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

>А где написано?

На просторах инета =)

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

>> это хорошая подсказка для HotSpot-а

>Объясни мне тупому, как можно это заоптимизировать. Честно, в упор не вижу, хотя был бы рад узнать.

Спроси у Блоха.

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

Теория и практика Java: Городские легенды о производительности:
http://www.ibm.com/developerworks/ru/library/j-jtp04223/index.html
Городской миф о производительности № 2: Декларирование классов и методов как final заставляет их работать быстрее

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

> В C++, например, рекомендуют использовать const

В С++ рекомендуют потому что код эффективнее становится, бо объект будет передан не в виде временного объекта-копии, а по ссылке.

smh ★★★
()

1. В Java все методы виртуальные. 2. Не надо писать final там, где этого не требует компилятор. Для Java это правило.

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

> 2. Не надо писать final там, где этого не требует компилятор. Для Java это правило.

Ну, если вы конечно не объявляете статическую константу. =)

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

>> Ну, если вы конечно не объявляете статическую константу. =)

И не только статическую ;)

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