Подтвердить что ты не робот

Использование конечных локальных переменных в java

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

public static void main(String args[]) {
    final String data = "Hello World!";
    System.out.println(data);
}

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

4b9b3361

Ответ 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

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