Paresseux champ d'initialisation avec des lambdas

Je tiens à mettre en œuvre paresseux champ d'initialisation (ou différé d'initialisation) sans une instruction if et de profiter des lambdas. Donc, je voudrais avoir le même comportement de la suite Foo bien, mais sans le if:

class A<T>{
    private T fooField;

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

Ignorer le fait que cette solution n'est pas de garantir l'utilisation sûre pour: 1) le multi-threading; 2) null comme une valeur valide de T.

Donc, pour exprimer l'intention que l'initialisation de la fooField est différé jusqu'à sa première utilisation, je voudrais déclarer la fooField du type Supplier<T> tels que:

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

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

et puis dans le getFoo bien, je voudrais juste revenir fooField.get(). Mais maintenant, je veux que la prochaine invocations à getFoo propriété éviter la expensiveInit() et il suffit de retourner le précédent T instance.

Comment puis-je réaliser que sans l'aide d'un if?

Malgré les conventions de nommage et le remplacement de la ->par =>, alors cet exemple pourrait être également considéré comme en C#. Toutefois, le montant NET Framework version 4 dispose déjà d'un Lazy<T> avec le désiré de la sémantique.

InformationsquelleAutor rodolfino | 2015-03-18