Объявление переменной final v. Отложенная реализация - PullRequest
0 голосов
/ 13 мая 2011

Задержка создания экземпляра

public class Foo{
    private NotSoExpensiveObject o;

    public NotSoExpensiveObject getNSEObject(){
        if(o == null){
            o = new NotSoExpensiveObject();
        }
        return o;
    }
}

Объявление финала

public class Foo{
    private final NotSoExpensiveObject o;

    public Foo(){
        o = new NotSoExpensiveObject();
    }
}

Имеет ли объявление NotSoExpensiveObject финал какое-либо преимущество перед задержкой его создания?Или это чисто ситуационный?Кроме того, есть ли способ отложить создание экземпляра и сохранить модификатор final?

Спасибо

Ответы [ 4 ]

1 голос
/ 13 мая 2011

Используется ли ваш класс Foo из разных потоков?Если да, вам нужно добавить синхронизацию в решение для отложенной инициализации.Вам бы не пришлось делать это, если бы вы использовали «окончательный» вариант.В этом случае JVM гарантирует, что ссылка на NoSoExорогоObject видна другим потокам.

Также нет способа сохранить модификатор final и все еще использовать отложенную инициализацию.Конечные члены должны быть инициализированы немедленно или через конструктор.

1 голос
/ 13 мая 2011

Final - это только ограничение времени компиляции , и, как таковые, финальные члены должны быть инициализированы встроенными, когда они объявлены или находятся в конструкторе. «Задержанный» финал хорош, когда разные конструкторы должны по-разному инициализировать конечный элемент.

1 голос
/ 13 мая 2011

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

1 голос
/ 13 мая 2011

Есть ли объявление NotSoExорогоObject финал имеет какое-либо преимущество перед отсрочкой его реализация? Или это чисто ситуационный? Als

final сделает его постоянным, неизменным (т. Е. CONST эквивалент C, как только вы его назначите, вы не сможете изменить значение). Это не имеет ничего общего с ленивой инициализацией

есть ли способ отложить создание экземпляра и сохранить окончательный модификатор

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

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