Использование конечных локальных переменных в java
Мне было интересно, есть ли возможность использования конечных локальных переменных. В любом случае переменные не переопределяются, когда наследование попадает в изображение. Например, простой код ниже
public static void main(String args[]) {
final String data = "Hello World!";
System.out.println(data);
}
Пример довольно простой и может не соответствовать соответствующему коду, но вопрос более общий. Я видел много кодов (все они включены в основную функцию, которые имеют конечные локальные переменные). Есть ли возможность использования локальных переменных как окончательный, кроме того, что они не могут быть отредактированы в одной и той же самой функции?
Ответы
Ответ 1
Во-первых, часть об "переопределенных" переменных - final
имеет два очень разных значения. Для классов и методов, это о наследовании; для переменных он должен быть только для чтения.
Есть одна важная "особенность" конечных локальных переменных: их можно использовать в локальных (обычно анонимных) внутренних классах. Не конечных локальных переменных быть не может. Это основное использование final
для локальных переменных, по моему опыту.
public void foo() {
final String x = "hello";
String y = "there";
Runnable runnable = new Runnable() {
@Override public void run() {
System.out.println(x); // This is valid
System.out.println(y); // This is not
}
};
runnable.run();
}
Обратите внимание, что в качестве стиля некоторые люди любят использовать final
, даже если они не захватывают переменную в локальном внутреннем классе. Мне было бы комфортно с final
быть стандартным, но другим модификатором для "non-final", но я нахожу, что добавление модификатора явно везде является слишком отвлекающим.
Ответ 2
Конечные локальные переменные могут быть доступны из анонимных внутренних подклассов, тогда как не конечные локальные переменные могут не быть.
Ответ 3
Да, юзабилити: - локальная конечная переменная доступна внутреннему классу метода.
Поскольку локальные переменные живут в стеке и существуют только для времени жизни метода, но объект класса Inner может жить дольше, поэтому внутренний класс не может получить доступ к какой-либо не конечной локальной переменной.
Но как только переменная является окончательной, внутренний класс уверен, что значение не изменится, чтобы сохранить частную копию конечной локальной переменной для использования.
Ответ 4
да, есть небольшой пример, где мы обычно могли его использовать -
Отрывок
final Boolean data = Boolean.TRUE;
button.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (data ) {
....
}
}
});
Его пример использования с анонимными внутренними классами. Если вы хотите использовать локальную переменную внутри внутренних calss, вы должны сделать final
.
Ответ 5
Идеальный ответ Jon Skeet, но есть еще одна (небольшая) польза от конечных переменных.
Компилятор будет гарантировать, что конечная переменная задается один раз и только один раз.
Скажем, вы должны инициализировать переменную, а вычисление значения является сложным (несколько if-then-else внутри if-then-else). Вы можете написать код, который не инициализирует переменную в некотором состоянии (или инициализирует ее дважды). Конечно, это ошибка. Создание окончательной переменной позволит компилятору проверить, что конечная переменная задается один раз и только один раз. Таким образом, вы будете знать быстро, если у вас есть ошибка.
Как я уже сказал, мало пользы, но все же удобной.
Ответ 6
Использование конечных локальных переменных в java
final
поля, параметры и локальные переменные только для чтения (означает идентификатор объекта, а не его состояние).
Ответ 7
Вы можете использовать ключевое слово final
для чтения и убедиться, что оно не изменено или в анонимных классах, как здесь:
final String s = "hi";
new Thread(new Runnable() {
@Override
public void run() {
// can use s variable here
}
}).start();
Ответ 8
Он говорит другим программистам, что тот, кто его написал, знал, что значение данных не должно меняться после назначения. По-моему, это хорошая привычка, особенно объявляющая переменные параметра окончательными.