Un getter che invoca 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, in tal caso, è necessario impostare un altro membro, è necessario preoccuparsi di riferimenti null accidentali se si accede alla proprietà nel codice di inizializzazione in cui tutti i membri non sono necessariamente impostati.
Ciò non significa "non accedere mai a un altro membro che non sia il campo di supporto delle proprietà all'interno del getter", significa solo prestare attenzione a ciò che stai implicando su quale sia lo stato richiesto dell'oggetto e se corrisponde al contesto che ti aspetti questa proprietà a cui si accede.
Tuttavia, nei due esempi concreti che hai fornito, il motivo per cui sceglierei uno sull'altro è completamente diverso. Il tuo getter viene inizializzato al primo accesso, ad esempio Lazy Initialization . Si presume che il secondo esempio sia inizializzato in un punto precedente, ad es . Inizializzazione esplicita .
Quando si verifica esattamente l'inizializzazione può o meno essere importante.
Ad esempio, potrebbe essere molto molto lento e deve essere eseguito durante una fase di caricamento in cui l'utente si aspetta un ritardo, piuttosto che il singhiozzo delle prestazioni inaspettatamente quando l'utente attiva per la prima volta l'accesso (ovvero, clic con il tasto destro dell'utente, viene visualizzato il menu di scelta rapida, utente ha già fatto nuovamente clic con il pulsante destro del mouse).
Inoltre, a volte c'è un punto evidente 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 lanciare eccezioni in seguito. In questa situazione ha senso anche memorizzare nella cache il valore a 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 ridurre a una regola, si riduce al codice concreto.