Lamby字段初始化与lambdas

我想实现懒惰字段初始化(或延迟初始化),而无需使用if语句并利用lambdas。所以,我想要具有以下Foo属性的相同行为,但没有if:

class A<T>{
    private T fooField;

    public T getFoo(){
        if( fooField == null ) fooField = expensiveInit();
        return fooField;
    }
}

忽略这个解决方案不能保证安全使用的事实:1)多线程; 2)作为T的有效值为null

所以,为了表达这样的意图,即fooField的初始化被推迟到它的首次使用之前,我想声明一个供应商< T>类型的fooField。如:

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中,您可以使用新的lambda更新fooField,例如:

class A<T>{
    private Supplier<T> fooField = () -> {
       T val = expensiveInit();
       fooField = () -> val;
       return val;
    };

    public T getFoo(){
       return fooField.get();
    }
}

再次,该解决方案与.Net Lazy< T>不是线程安全的,并且不能确保对getFoo属性的并发调用返回相同的结果。

http://stackoverflow.com/questions/29132884/lazy-field-initialization-with-lambdas

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Lamby字段初始化与lambdas