Java 声明变量final v。延迟实例化
延迟实例化Java 声明变量final v。延迟实例化,java,design-patterns,final,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 fi
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
修饰符
谢谢
声明NotSoExpensiveObject
决赛比拖延有什么好处
它的实例化?还是纯粹是这样
情境的?肌萎缩侧索硬化
final
将使其保持不变,不可修改(即CONST
相当于C,一旦赋值,就不能更改值)。它与惰性初始化无关
有没有办法延迟实例化并保留最后的修饰符
可能您看到这段代码的地方不希望值不可修改,因此
finalfinal只是一个编译时限制,因此final成员在声明或在构造函数中时必须内联初始化。当不同的构造函数需要以不同的方式初始化最终成员时,“延迟的”final很好 延迟实例化可能不是线程安全的,除非您进行同步。您的Foo类是从不同的线程使用的吗?如果是,则需要将同步添加到延迟初始化解决方案中。如果使用“最终”变体,则不必执行此操作。在这种情况下,JVM保证对NoSoExpensiveObject的引用对其他线程可见
也没有办法保留最后一个修饰符,仍然使用延迟初始化。最终成员需要立即初始化或通过构造函数初始化。在不可修改的点上,您可能要小心。它可以解释为一个可变对象不知何故变得不可修改。@Andrew谢谢,添加了更多信息你所说的“延迟”最终结果是什么意思?当我延迟其实例化时,我不能声明NotSoExpensiveObject
final,尽管它基本上保证由Foo
的每个实例初始化一次。我想我真正好奇的是,给变量指定final
修饰符是否有任何性能好处……可能没有。延迟是指将值分配给构造函数中的最终成员,而不是成员。final的不同用法在性能上存在差异,但如果使用final,性能可能会略有提高。我认为这仅适用于局部变量,您可以检查Modifier.isFinal(myField)。我记得读过一篇文章,声明类变量final会影响它们的初始化方式,这会影响同步吗?