2012-02-08 2 views
6

Можно создать дубликат:
Is there any performance reason to declare method parameters final in Java?
Why would one mark local variables and method parameters as “final” in Java?Java: Почему Локальная переменная должна быть объявлена ​​окончательная

Я использую PMD, чтобы увидеть нарушения кода.

Внутри метода WebService, я это ниже код

public ServiceRequest getData() 
{ 
Status status = new Status(); 
// code 
} 

Что ПМД предполагая меня является то, что эта локальная переменная состояния может быть объявлен как окончательный.

Вопрос в том, что окончательный результат может привести к каким-либо улучшениям производительности или, если это не поможет, что может получить код?

+0

Дубликат http://stackoverflow.com/a/266981/259576 –

+0

Как описано в [stackoverflow answer] (http://stackoverflow.com/questions/316352/why-would-one-mark-local-variables -and-method-parameters-as-final-in-java), компилятор может создать оптимизированный код для лучшей производительности. – ChangeRequest

+0

Просьба описать оптимизацию * single *, которая возможна только в том случае, если локальная переменная объявлена ​​окончательной, потому что я, конечно, не могу думать ни о чем, и я не вижу ни одного, описанного в вашей ссылке. – Voo

ответ

1

Я не знаю о преимуществах производительности, сделав статус окончательным, но PMD предлагает вам это, потому что, возможно, вы никогда не записываете статус после его первой инициализации.

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

4

Взятый из следующей статьи: http://www.javapractices.com/topic/TopicAction.do?Id=23

  • четко передает ваше намерение
  • позволяет компилятору и виртуальная машина для выполнения небольших оптимизаций
  • явно флаги вещи, которые проще в поведении - окончательный говорят: «Если вы ищете комп lexity, вы не найдете его здесь ».

Это также обсуждается в этом вопросе: Can excessive use of final hurt more than do good?

+1

'позволяет компилятору и виртуальной машине выполнять небольшие оптимизации' - umn no, не совсем. Какая была бы оптимизация? – Voo

+2

Я видел, как компилятор Sun испускает незначительно короткий байт-код, когда единственной разницей между этими двумя методами была «конечность» локальных переменных. Микро-оптимизации - это настоящая вещь, и компиляторы действительно делают их. Разумеется, действительно важно то, что делает JIT с байт-кодом, а локальные ссылки теряют свою «финуальность» при компиляции в байт-код. Я думаю, именно поэтому существует так много предположений о конечных локальных переменных: это совершенно недетерминированные результаты. Однако использование конечных локалей может повлиять на байт-код - для чего это стоит. –

+0

Созданный javac байт-код не кодирует, что переменная является окончательной. JIT не знает, что переменная была когда-то окончательной. –

4

final означает, что локальная переменная не будет изменена. Я чувствую, что методы должны быть настолько короткими, чтобы вы могли их легко понять, и поэтому окончание переменной может быть немного избыточным.

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

+0

Согласен. Единственная причина, по которой я использую конечные локали, - это использовать анонимные классы (но также и не потому, что я ** хочу **). И я сомневаюсь в заявленных преимуществах производительности - я не вижу, какую дополнительную информацию мы получаем там. – Voo

+0

JIT достаточно умен, чтобы выработать переменную, которая является окончательной, поэтому я сомневаюсь, что она значительно улучшает производительность. Компилятор 'javac' также должен быть достаточно умным, чтобы выработать переменную, которая фактически является окончательной (т. Е. Никогда не менялась) и не требует ее для анонимных классов IMHO. «Конечные» переменные полезны в сложных сложных методах, но реальное решение состоит в том, чтобы повторно закрепить свой код, чтобы у вас не было больших сложных методов. ;) –

+1

Так как у нас нет ссылок в java, я не вижу, как окончательное изменение кода каким-либо образом. Рассмотрим: 'int x = 10', x будет 10 до тех пор, пока мы не назначим xa новое значение * внутри самого метода * (хорошо, да, компилятор/JIT должен проверить, не делаем ли мы этого, но это очевидно, чтобы проверить). Да, окончательный вариант может быть полезен для других программистов, но тогда мы все согласны с тем, что если метод настолько длинный и сложный, что мы не видим всех присваиваний переменных на один взгляд, у нас есть гораздо большая проблема;) – Voo

Смежные вопросы

 Смежные вопросы