Mi limiterei a lanciare un'eccezione non controllata.
Il motivo è che non è compito chiamare gli oggetti per validare il tuo oggetto. Inoltre, tirare la logica di caricamento su un metodo separato significa che il codice di chiamata deve sapere chiamare il metodo A prima del metodo B, e potenzialmente il metodo A può / deve essere chiamato una sola volta. Questo è un anti-pattern di sequenziamento.
In questo caso, preferisco il caricamento pigro che, se fatto correttamente, assicura che il caricamento sia effettuato una sola volta, B. il codice chiamante non ha bisogno di sapere che i metodi della classe dovrebbero essere chiamati in un ordine specifico, potenzialmente interrotto se non lo fanno.
Pseudocodice:
public object getObject() {
if (this.data == null) {
loadObject()
}
return this.data
}
private void loadObject() {
// Expensive loading logic...
}
Modifica: vorrei chiarire che i getter / gli accessor dovrebbero, generalmente, non lanciare nulla. Tuttavia, in questo caso, non abbiamo a che fare con un semplice getter. Mi piace pensare a questo non come "ottenere alcune semplici variabili memorizzate sull'oggetto", ma "vai a prendermi un po 'di birra dal frigo, e se non ce ne sono più, lancia una NullPointerException." Dopotutto se stai ottenendo un valore da qualche file binario o altro, hai intenzione di impostarlo anche tu? Probabilmente no. Quindi forse un'altra domanda è "dovrebbe essere chiamato un 'getter' per cominciare?" che è una domanda separata.