Когда следует использовать final для параметров метода и локальных переменных? - PullRequest
157 голосов
/ 30 сентября 2008

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

С одной стороны, компилятор может сделать некоторые оптимизации, и это делает намерение программиста более ясным. С другой стороны, это добавляет многословие, и оптимизация может быть тривиальной.

Это то, что я должен попытаться вспомнить?

Ответы [ 16 ]

2 голосов
/ 01 октября 2008

Из вопроса, очевидно ли это, неясно, но окончательный параметр метода влияет только на тело метода. Он НЕ передает любую интересную информацию о намерениях метода вызывающему. Передаваемый объект все еще может быть видоизменен внутри метода (финал не является концом), а область действия переменной находится внутри метода.

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

Для переменных экземпляра я бы сделал их окончательными, если они логически постоянны.

1 голос
/ 30 сентября 2008

Если у вас есть внутренние (анонимные) классы, и для метода требуется доступ к переменной содержащего метода, эта переменная должна быть финальной.

Кроме того, то, что вы сказали, верно.

1 голос
/ 30 сентября 2008

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

0 голосов
/ 20 августа 2017

Очень простой ответ: у нас есть 3 случая с Final с переменными, Final с методами && Final с классами.

1.Финал с переменной: нельзя присвоить эту переменную более одного раза.

2. Финал с методами: вы не можете переопределить этот метод ..

3. Финал с классами: вы не можете продлить окончательный класс

0 голосов
/ 28 ноября 2015

Используйте ключевое слово final для переменной, если вы делаете эту переменную как immutable

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

С выпуском Java 8 мы получили еще одну концепцию под названием "effectively final variable". Не финальная переменная может превращаться в конечную переменную.

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

Переменная считается эффективная окончательная , если она не была изменена после инициализации в локальном блоке. Это означает, что теперь вы можете использовать локальную переменную без заключительного ключевого слова в анонимном классе или лямбда-выражении, при условии, что они должны быть действительно окончательными.

До Java 7 нельзя использовать нефинальную локальную переменную внутри анонимного класса, но из Java 8 вы можете

Посмотрите на эту статью

0 голосов
/ 08 июля 2013

Прежде всего, последнее ключевое слово используется для создания константы переменной. Постоянная означает, что она не меняется. Например:

final int CM_PER_INCH = 2.54;

Вы бы объявили переменную final, потому что сантиметр на дюйм не меняется.

Если вы попытаетесь переопределить конечное значение, переменная будет объявлена ​​первой. Например:

final String helloworld = "Hello World";
helloworld = "A String"; //helloworld still equals "Hello World"

Ошибка компиляции:

local variable is accessed from inner class, must be declared final

Если ваша переменная не может быть объявлена ​​окончательной или вы не хотите объявлять ее окончательной, попробуйте следующее:

final String[] helloworld = new String[1];
helloworld[0] = "Hello World!";
System.out.println(helloworld[0]);
helloworld[0] = "A String";
System.out.println(helloworld[0]);

Будет напечатано:

Hello World!
A String
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...