我想在没有 if 语句的情况下实现延迟字段初始化(或延迟初始化)并利用 lambda。所以,我希望有以下相同的行为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
?
尽管命名约定和替换->
by =>
,那么这个例子也可以在 C# 中考虑。但是,. NET Framework 版本 4 已经提供了Lazy<T>
具有所需的语义。
在您的实际 lambda 中,您可以简单地更新fooField
使用新的 lambda,例如:
class A<T>{
private Supplier<T> fooField = () -> {
T val = expensiveInit();
fooField = () -> val;
return val;
};
public T getFoo(){
return fooField.get();
}
}
同样,这个解决方案不像 .Net 那样是线程安全的Lazy<T>
,并且不确保并发调用getFoo
属性返回相同的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)