Я хотел бы реализовать инициализацию ленивого поля (или отложенную инициализацию) без инструкции 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>
желаемую семантику.