Создание аргументов java-метода в качестве окончательного
Какая разница, что final
делает между кодом ниже. Есть ли преимущество в объявлении аргументов как final
.
public String changeTimezone( Timestamp stamp, Timezone fTz, Timezone toTz){
return ....
}
public String changeTimezone(final Timestamp stamp, final Timezone fTz,
final Timezone toTz){
return ....
}
Ответы
Ответ 1
Как параметр формального метода является локальной переменной, вы можете получить к ним доступ из внутренних анонимных классов, только если они объявлены как final.
Это избавит вас от объявления другой локальной конечной переменной в теле метода:
void m(final int param) {
new Thread(new Runnable() {
public void run() {
System.err.println(param);
}
}).start();
}
Ответ 2
Извлечь из Последнее слово по ключевому слову final
Конечные параметры
В следующем примере объявляются конечные параметры:
public void doSomething(final int i, final int j)
{
// cannot change the value of i or j here...
// any change would be visible only inside the method...
}
final используется здесь для обеспечения двух индексы я и j не будут случайно reset с помощью метода. Это удобный способ защищать от коварной ошибки что ошибочно изменяет значение ваши параметры. Вообще говоря, короткие методы - лучший способ защищать от этого класса ошибок, но конечные параметры могут быть полезными дополнение к вашему стилю кодирования.
Обратите внимание, что конечные параметры не являются рассматриваемая часть метода подписи и игнорируются компилятор при разрешении вызовов метода. Параметры могут быть объявлены окончательными (или не), не влияя на то, как метод завышен.
Ответ 3
Финал не позволяет вам присвоить новое значение переменной, и это может быть полезно при обнаружении опечаток. Стилистически вы можете оставить полученные параметры без изменений и назначить их только локальным переменным, поэтому final поможет реализовать этот стиль.
Должен признать, я редко помню, чтобы использовать final для параметров, может быть, я должен.
public int example(final int basicRate){
int discountRate;
discountRate = basicRate - 10;
// ... lots of code here
if ( isGoldCustomer ) {
basicRate--; // typo, we intended to say discountRate--, final catches this
}
// ... more code here
return discountRate;
}
Ответ 4
Это не имеет большого значения. Это просто означает, что вы не можете писать:
stamp = null;
fTz = new ...;
но вы все равно можете написать:
stamp.setXXX(...);
fTz.setXXX(...);
В основном это подсказка для программиста по обслуживанию, который следует за вами, что вы не собираетесь назначать новое значение параметру где-то посередине вашего метода, где это не очевидно и может вызвать путаницу.
Ответ 5
Конечное ключевое слово, используемое для параметров/переменных в Java, обозначает ссылку как окончательную. В случае передачи объекта другому методу система создает копию ссылочной переменной и передает ее методу. Отметив новые ссылки final, вы защитите их от переназначения. Иногда он считал хорошей практикой кодирования.
Ответ 6
Для тела этого метода ключевое слово final
будет препятствовать случайному переназначению ссылок на аргументы, давая ошибку компиляции в этих случаях (большинство IDE будут жаловаться сразу). Некоторые могут утверждать, что использование final
в общем случае, когда это возможно, ускорит процесс, но это не так в недавних JVM.
Ответ 7
Его просто конструкция на Java, чтобы помочь вам определить контракт и придерживаться его. Аналогичное обсуждение здесь: http://c2.com/cgi/wiki?JavaFinalConsideredEvil
BTW - (как говорит twiki), обозначение args как final обычно является избыточным, если вы следуете хорошим принципам программирования и выполняете hass reissign/redefine ссылку на входящие аргументы.
В худшем случае, если вы переопределите ссылку args, это не повлияет на фактическое значение, переданное функции, поскольку передано только сообщение.
Ответ 8
Я говорю о маркировке переменных и полей final в целом - не просто применяется к аргументам метода. (Методы маркировки/классы final - это совсем другое).
Это услуга для читателей/будущих сопровождающих вашего кода. Вместе с разумным именем переменной полезно и обнадеживает читатель вашего кода, чтобы увидеть/понять, что представляют собой переменные, о которых идет речь, - и это обнадеживает читателя, что всякий раз, когда вы видите переменную в той же области действия, смысл остается то же самое, поэтому (а) он не должен почесывать голову, чтобы всегда понять, что означает переменная в каждом контексте. Мы видели слишком много злоупотреблений в отношении "повторного использования" переменных, что затрудняет понимание даже короткого фрагмента кода.
Ответ 9
- В прошлом (до Java 8 :-))
Явное использование ключевого слова "final" повлияло на доступность переменной метода для внутренних анонимных классов.
- В современном (Java 8+) языке нет необходимости в таком использовании:
Java представила "эффективно финальные" переменные. Локальные переменные и параметры метода считаются окончательными, если код не предполагает изменения значения переменной. Поэтому, если вы видите такое ключевое слово в Java 8+, вы можете предположить, что оно не нужно. Введение "эффективно финального" заставляет нас меньше набирать код при использовании лямбды.
Ответ 10
Конечное ключевое слово не позволяет назначить новое значение параметру. Я хотел бы объяснить это простым примером
Предположим, что у нас есть метод
метод1() {
Дата dateOfBirth = новая дата ( "1/1/2009" );
метод2 (DateOfBirth);
method3 (DateOfBirth); }
public mehod2 (Дата dateOfBirth) {
....
....
....
}
public mehod2 (Дата dateOfBirth) {
....
....
....
}
В приведенном выше случае, если "dateOfBirth" присвоено новое значение в методе2, это приведет к неправильному выводу метода method3. Поскольку значение, которое передается методу3, не является тем, что было перед передачей методу2. Поэтому, чтобы избежать этого ключевого слова final используется для параметров.
И это также одна из лучших практик Java Coding.