V'è in realtà un buon motivo per includere non menzionato in queste risposte:
Se l'esistenza di un costruttore senza argomenti è esplicitamente parte del contratto per l'oggetto, allora dovrebbe essere esplicitamente .
Se si intende esplicitamente per il client la sottoclasse del codice, come ad es. Java Swing, quindi è una buona idea rendere esplicitamente un costruttore no-arg accessibile, anche se non ci sono altri costruttori. Altrimenti, se un altro programmatore, nella sua saggezza, decide di creare un altro costruttore, il nuovo costruttore esplicito rimuoverà il costruttore implicito no-arg e interromperà il codice client.
Se il codice è sottoclassato nella propria base di codice, questo verrà visualizzato come errore del compilatore, ma se il codice deve essere pubblicato come jar e sottoclassato dal client non ci sarà alcun errore del compilatore .
Ovviamente, si potrebbe obiettare che se la sua parte del contratto dovresti avere un test di junit per questo, e avresti ragione! Ma se stai lavorando su una base di codice di grandi dimensioni in cui i test richiedono ore di esecuzione per la tua build giornaliera, rompendo la tua build giornaliera perché hai dimenticato di dover fare esplicitamente un costruttore no arg quando aggiungi un costruttore è un enorme spreco di tempo quando un costruttore esplicito e un commento avrebbe evitato qualsiasi possibilità di errore.
L'obiettivo del buon codice è di rendere il più semplice possibile per un altro sviluppatore di modificarlo senza errori!
fonte
2015-06-29 14:03:03
Una nota sulla semantica, il nome corretto per tale costruttore è un "costruttore senza argomenti". È solo un costruttore "predefinito" quando il compilatore lo genera automaticamente per impostazione predefinita. –