Окончательная инициализация в Java может быть отложена, как это предотвращает непреднамеренный возврат нуля? - PullRequest
1 голос
/ 07 июня 2009

В вопросе «скрытые возможности java» кто-то упоминает, что окончательная инициализация может быть отложена, и приводит пример:

public Object getElementAt(int index) {
    final Object element;
    if (index == 0) {
         element = "Result 1";
    } else if (index == 1) {
         element = "Result 22";
    } else {
         element = "Result 3";
    }
    return element;
}

На плакате написано:

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

Однако я не могу обернуть голову, что это значит. Чем это отличается, если элемент не был объявлен как final? Разве оператор else не гарантирует, что null не будет возвращен? Я думаю, что это скорее косметическая вещь, чем действительное влияние на работу кода.

Ответы [ 2 ]

4 голосов
/ 07 июня 2009

То, как вы разместили вопрос, похоже, что на плакате написано:

 Object element = null;

И затем, установив его с помощью методов if, вы можете возвратить null случайно (если вы не правильно создали оператор else), поэтому воспользуйтесь тем фактом, что окончательная инициализация может отличаться после объявления.

Однако, пример излишен, потому что компилятор гарантирует, что эта переменная будет установлена ​​перед использованием, потому что она локальна.

Более интересным был бы такой случай:

public class SomeClass {
     private final Object element;

     public SomeClass(int index) {
            if (index == 0) {
                element = "Result 1";
            } else if (index == 1) {
                element = "Result 22";
            } else {
                element = "Result 3";
            }
     }
}

В этом случае компилятор предупредит вас, если вы никогда не установите элемент, вместо того, чтобы установить для него значение null, что произойдет, если он не был объявлен как final.

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

1 голос
/ 07 июня 2009

Финалы могут быть только установлены и никогда не переустанавливаться. Иногда они связаны с понятием констант в Java. Вернее, они являются неизменяемыми ссылками на объекты.

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

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