Un getter che richiama altre proprietà e metodi per calcolare il proprio valore implica anche una dipendenza. Ad esempio, se la proprietà deve essere in grado di calcolare se stessa, e così facendo richiede l'impostazione di un altro membro, è necessario preoccuparsi di riferimenti nulli accidentali se si accede alla proprietà nel codice di inizializzazione in cui tutti i membri non sono necessariamente impostati. / p>
Questo non significa 'non accedere mai ad un altro membro che non è il campo di supporto delle proprietà all'interno del getter', significa solo prestare attenzione a ciò che stai implicando riguardo allo stato richiesto dell'oggetto, e se questo corrisponde al contesto in cui ci si aspetta che questa proprietà sia accessibile.
Tuttavia, nei due esempi concreti che hai dato, la ragione per cui scegliere uno sull'altro è completamente diversa. Il tuo getter è inizializzato al primo accesso, ad es. Inizializzazione pigra . Si presume che il secondo esempio sia inizializzato in qualche punto precedente, ad esempio Inizializzazione esplicita .
Quando si verifica esattamente l'inizializzazione può o non può essere importante.
Ad esempio potrebbe essere molto molto lento e deve essere fatto durante una fase di caricamento in cui l'utente si aspetta un ritardo, piuttosto che una prestazione inaspettata quando l'utente innesca per primo l'accesso (es. clic destro dell'utente, menu di scelta rapida appare, l'utente ha già fatto clic di nuovo con il tasto destro del mouse).
Inoltre, a volte c'è un punto ovvio nell'esecuzione in cui si verifica tutto ciò che può influenzare / sporcare il valore della proprietà memorizzata nella cache. Potresti anche verificare che nessuna delle dipendenze cambi e generare eccezioni in seguito. In questa situazione ha senso memorizzare anche il valore in quel punto, anche se non è particolarmente costoso da calcolare, solo per evitare di rendere l'esecuzione del codice più complessa e più difficile da seguire mentalmente.
Detto questo, Lazy Initialization ha molto senso in molte altre situazioni. Quindi, come spesso accade nella programmazione, è difficile ridurlo a una regola, si scende al codice concreto.