Potrebbe valere la pena considerare l'utilizzo di un metodo factory statico anziché di un costruttore.
sto dicendo invece, ma ovviamente non è possibile sostituire il costruttore. Quello che puoi fare, però, è nascondere il costruttore dietro un metodo statico di fabbrica. In questo modo, pubblichiamo il metodo factory statico come parte dell'API della classe, ma allo stesso tempo nascondiamo il costruttore rendendolo privato o privato del pacchetto.
Si tratta di una soluzione abbastanza semplice, soprattutto in confronto con il modello Builder (come si vede in Joshua Bloch di Effective Java 2nd Edition - attenzione, Banda dei Design Patterns di Quattro definiscono un modello di progettazione completamente diverso con lo stesso nome, in modo che possa essere leggermente confuso) che implica la creazione di una classe nidificata, un oggetto costruttore, ecc.
Questo approccio aggiunge un ulteriore livello di astrazione tra te e il tuo cliente, rafforzando l'incapsulamento e semplificando le modifiche lungo la strada. Fornisce anche il controllo dell'istanza: poiché gli oggetti vengono istanziati all'interno della classe, tu e non il cliente decidete quando e come questi oggetti vengono creati.
Infine, rende più semplice il test - fornendo un costruttore stupido, che assegna semplicemente i valori ai campi, senza eseguire alcuna logica o convalida, consente di introdurre uno stato non valido nel sistema per verificare come si comporta e reagisce a quella. Non sarai in grado di farlo se stai convalidando i dati nel costruttore.
Si può leggere molto di più che in (già citato) di Joshua Bloch Effective Java 2nd Edition - è uno strumento importante nella toolbox tutti gli sviluppatori e non c'è da meravigliarsi che sia l'oggetto del primo capitolo del libro. ;-)
Seguendo il tuo esempio:
public class Book {
private static final String DEFAULT_TITLE = "The Importance of Being Ernest";
private final String title;
private final String isbn;
private Book(String title, String isbn) {
this.title = title;
this.isbn = isbn;
}
public static Book createBook(String title, String isbn) {
return new Book(title, isbn);
}
public static Book createBookWithDefaultTitle(String isbn) {
return new Book(DEFAULT_TITLE, isbn);
}
...
}
qualsiasi modo si sceglie, è una buona pratica per avere uno principale costruttore, che assegna solo ciecamente tutti i valori, anche se è usato solo da altri costruttori.
Dipende, avete bisogno di tutti i campi per contenere un valore? – CodeMonkey
questo articolo potrebbe essere utile: http://www.yegor256.com/2015/05/28/one-primary-constructor.html – yegor256
Non mi piace quando le persone fanno domande e quindi non accettano le risposte. – muni764