延迟实例化
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
修饰符?
由于
答案 0 :(得分:1)
声明NotSoExpensiveObject final比延迟有任何优势 它的实例化?或者这是纯粹的 情景? ALS
final
将使其保持不变,不可修改(即CONST
相当于C,一旦指定它就无法更改值)。它与懒惰启动无关
有没有办法延迟实例化,并保留最终修饰符
可能您看到此代码的地方不希望值不可修改,因此final
答案 1 :(得分:1)
最终只是编译时限制,因此必须在声明成员或构造函数时初始化成员。当不同的构造函数需要以不同方式初始化最终成员时,“延迟”最终是很好的。
答案 2 :(得分:1)
延迟实例化可能不是线程安全的,除非您进行同步。
答案 3 :(得分:1)
您的Foo类是否来自不同的线程?如果是,则需要向延迟初始化解决方案添加同步。如果使用“最终”变体,则不必执行此操作。在这种情况下,JVM保证对其他线程可以看到对NoSoExpensiveObject的引用。
也无法保留最终修饰符并仍然使用延迟初始化。最终成员需要立即初始化或通过构造函数初始化。