Java che genera un costruttore senza parametri quando non ne hai è come un gentile cameriere che ti prende il cappotto.
Java continua a generare un costruttore senza parametri dopo aver definito un'altra versione di esso è come lo stesso cameriere che ti toglie il cappotto dopo aver dato una chiara indicazione che hai i tuoi piani su cosa fare con il cappotto.
Se ho una classe (che voglio essere immutabile):
class Person
{
final String firstName;
final String lastName;
E aggiungo un costruttore:
Person(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
E Java doveva ancora fornire un costruttore predefinito, senza parametri, quindi questo codice non può essere compilato, perché i campi firstName
e lastName
sono dichiarati come finali, ma non vengono impostati dopo aver chiamato Person p = new Person()
.
Mi stai costringendo a fornire un'altra implementazione:
private Person()
{
this.firstName = null; // or "", or whatever
this.lastName = null;
}
E dal momento che non lo voglio - poiché è inutile, potrei sentirmi incline a mettere teschi e ossa incrociate su di esso:
@Deprecated
private Person()
{
// don't use this constructor! i don't want it to ever be called!
throw new RuntimeException("Illegal constructor called");
}
Ma non posso ancora vietare a un altro sviluppatore di creare un metodo (all'interno della classe Person
, quindi contrassegnare il costruttore come privato non ha aiutato):
public static Person createPerson()
{
return new Person(); // this will blow in our face
}
Tutta questa confusione potrebbe essere - ed è - evitata grazie al fatto che Java (e non solo Java) funziona nel modo in cui funziona.
Se definisci un metodo setCoordinates(int x, int y)
, non ti aspetti che il compilatore accetti automaticamente una versione senza parametri di esso - setCoordinates()
. Non farebbe nulla.
In che modo è diverso dall'aspettarsi un costruttore senza parametri? Beh, ovviamente, un costruttore fa sempre almeno una cosa: crea un oggetto (o muore cercando).
Ma mi piace essere in controllo di come voglio che i miei oggetti siano istanziati. Costringermi ad avere un costruttore senza parametri, qualunque cosa faccia, toglie questo controllo da me.