Foo
属性相同的行为,但是不需要使用if
语句。class A<T>{
private T fooField;
public T getFoo(){
if( fooField == null ) fooField = expensiveInit();
return fooField;
}
}
忽略这个解决方案不能保证以下情况的安全使用:1)多线程;2)将
null
作为T
的有效值。因此,为了表达将
fooField
的初始化推迟到第一次使用时的意图,我想声明fooField
的类型为Supplier<T>
,如下所示:class A<T>{
private Supplier<T> fooField = () -> expensiveInit();
public T getFoo(){
return fooField.get();
}
}
然后,在getFoo
属性中,我只需返回fooField.get()
。但现在我希望下一次对getFoo
属性的调用可以避免expensiveInit()
,并且只返回以前的T
实例。
如何在不使用if
的情况下实现这一点?
尽管命名约定和将->
替换为=>
,则该示例也可以在C#中使用。然而,.NET Framework 4版本已经提供了具有所需语义的Lazy<T>
。
Lazy
呢? - rodolfino