2011-05-13 25 views
-1

延迟实例声明变量最终诉延迟实例

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修饰符?

感谢

回答

1

声明NotSoExpensiveObject 最终是否有过拖延 其实例什么优势?或者这纯粹是情景吗?阿尔斯

final将使不变,不可修改(即。CONST当量C,一旦你分配给它,你不能改变的值)。它无关,与懒动初始化

是有延迟的实例化,并保持final修饰符

也许在这里你看到这个代码的地方的方式欲养而不能以价值是非可修改等final

+1

你可能会在那里不可修改的地方小心。它可能意味着一个可变对象变得不可修改。 – 2011-05-13 14:14:28

+0

@安德鲁谢谢,增加更多信息 – 2011-05-13 14:17:51

1

最后只是一个编译时间限制和因此这样的决赛成员必须初始化内联时,他们被声明或在构造函数。当不同的构造函数需要以不同的方式初始化最后一个成员时,“延迟”最后是很好的。

+0

你是什么意思_“延迟”final_?当我延迟它的实例化时,我不能声明'NotSoExpensiveObject' final,虽然它基本上保证被每个'Foo'实例初始化一次。我想我真正好奇的是,如果给变量赋值'final'修饰符有任何性能好处...可能不会。 – mre 2011-05-13 14:17:03

+0

通过延迟我的意思是将值赋给构造函数中的最终成员而不是成员。 Final的不同用途有不同的性能差异,但如果使用final,则可能会有轻微的性能提升。 – 2011-05-13 14:19:15

+0

我虽然这只适用于局部变量,并且您可以检查Modifier.isFinal(myField)。我记得读过,声明类变量final有影响如何初始化,这可能会影响同步? – tofarr 2011-05-13 14:25:48

1

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

+0

为简洁起见,我省略了同步,但是有效! – mre 2011-05-13 14:21:19

1

您的Foo类是从不同的线程使用的吗?如果是,则需要将同步添加到惰性初始化解决方案。如果您使用了“最终”变体,则不必这样做。在这种情况下,JVM保证对其他线程可见对NoSoExpensiveObject的引用。

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