声明变量final v。延迟实例化

时间:2011-05-13 14:08:36

标签: java design-patterns final

延迟实例化

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是否优于延迟其实例化?或者这是纯粹的情境?另外,有没有办法延迟实例化,并保留final修饰符?

由于

4 个答案:

答案 0 :(得分:1)

  

声明NotSoExpensiveObject   final比延迟有任何优势   它的实例化?或者这是纯粹的   情景? ALS

final将使其保持不变,不可修改(即CONST相当于C,一旦指定它就无法更改值)。它与懒惰启动无关

  

有没有办法延迟实例化,并保留最终修饰符

可能您看到此代码的地方不希望值不可修改,因此final

答案 1 :(得分:1)

最终只是编译时限制,因此必须在声明成员或构造函数时初始化成员。当不同的构造函数需要以不同方式初始化最终成员时,“延迟”最终是很好的。

答案 2 :(得分:1)

延迟实例化可能不是线程安全的,除非您进行同步。

答案 3 :(得分:1)

您的Foo类是否来自不同的线程?如果是,则需要向延迟初始化解决方案添加同步。如果使用“最终”变体,则不必执行此操作。在这种情况下,JVM保证对其他线程可以看到对NoSoExpensiveObject的引用。

也无法保留最终修饰符并仍然使用延迟初始化。最终成员需要立即初始化或通过构造函数初始化。