Я хотел бы реализовать инициализацию ленивого поля (или отложенную инициализацию) без инструкции if и использования lambdas. Итак, я хотел бы иметь такое же поведение следующего свойства 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?
Несмотря на соглашения об именах и замену -> на =>, этот пример можно также рассмотреть в С#. Однако .NET Framework версии 4 уже предоставляет Lazy<T> желаемую семантику.