Объявление переменной неизменяемой (окончательной) само по себе является довольно хорошей причиной. Помимо добавления ясности в код, он также предоставляет некоторую ценную информацию компилятору, который мог бы лучше оптимизировать код, когда он знает, что некоторые вещи не будут меняться.
Еще одна причина может быть скрыта в вашем примере за многоточием: если в этой функции есть замыкание, которое ссылается на эти локальные переменные, оно не будет компилироваться, если они не являются окончательными. Представьте себе что-то вроде этого, например:
public void foo() {
final int x = 3;
final Object z = new Object();
new Thread() {
public void run() {
for(int i = 0; i < x; i++) {
System.out.println(z);
}
}
}.start();
}
Для этого необходимо, чтобы x и z были объявлены окончательными. Зачем? Ну, локальные переменные создаются в стеке, и, как только функция возвращается, они полностью исчезают. Но код внутри метода Thread.run()
, определенный здесь, все еще может выполняться после того, как функция, которая его создала, вернется. Поскольку переменные являются окончательными, их значения известны JVM в момент создания замыкания, поэтому он может просто скопировать значения в закрытие. Если они не были окончательными, это было бы невозможно, потому что копии будут устаревать, как только будет изменено исходное значение.
Что вы подразумеваете под «есть ли какая-либо другая причина для этого»? Не могли бы вы уточнить свой вопрос? – abl