我想在没有if语句的情况下实现惰性字段初始化(或延迟初始化)并利用lambdas.所以,我想具有以下Foo
属性的相同行为,但没有if
:
class A<T>{
private T fooField;
public T getFoo(){
if( fooField == null ) fooField = expensiveInit();
return fooField;
}
}
Run Code Online (Sandbox Code Playgroud)
忽略这个解决方案不能保证安全使用的事实:1)多线程; 2)null
作为有效值T
.
因此,为了表达初始化fooField
被推迟到第一次使用的意图,我想声明fooField
类型Supplier<T>
如下:
class A<T>{
private Supplier<T> fooField = () -> expensiveInit();
public T getFoo(){
return fooField.get();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在getFoo
财产中我会回来fooField.get()
.但是现在我想要对getFoo
属性的下一次调用避免expensiveInit()
并且只返回前一个T
实例.
如何在不使用的情况下实现这一目标if
?
尽管命名约定并替换了->
by =>
,但是这个例子也可以在C#中考虑.但是,.NET Framework版本4已经提供了Lazy<T>
所需的语义.