Java, das einen parameterlosen Konstruktor generiert, wenn Sie keinen anderen haben, ist wie ein höflicher Kellner, der Ihren Mantel für Sie nimmt.
Java, das nach dem Definieren einer anderen Version immer noch einen parameterlosen Konstruktor generiert, ist wie derselbe Kellner, der Ihnen den Mantel auszieht, nachdem Sie klar angegeben haben, dass Sie Ihre eigenen Pläne haben, was Sie mit dem Mantel tun sollen.
Wenn ich eine Klasse habe (die ich unveränderlich sein möchte):
class Person
{
final String firstName;
final String lastName;
Und ich füge einen Konstruktor hinzu:
Person(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
Und Java sollte immer noch einen standardmäßigen, parameterlosen Konstruktor bereitstellen, dann kann dieser Code nicht kompiliert werden, da firstName
und lastName
Felder als endgültig deklariert werden, aber nach dem Aufruf nicht festgelegt werden Person p = new Person()
.
Sie zwingen mich, eine weitere Implementierung bereitzustellen:
private Person()
{
this.firstName = null; // or "", or whatever
this.lastName = null;
}
Und da ich es nicht will - da es nutzlos ist, könnte ich geneigt sein, Totenkopf darauf zu legen:
@Deprecated
private Person()
{
// don't use this constructor! i don't want it to ever be called!
throw new RuntimeException("Illegal constructor called");
}
Aber ich kann einem anderen Entwickler immer noch nicht verbieten, eine Methode zu erstellen (innerhalb der Person
Klasse hat es also nicht geholfen, den Konstruktor als privat zu markieren):
public static Person createPerson()
{
return new Person(); // this will blow in our face
}
All diese Aufregung könnte - und wird - vermieden werden, da Java (und nicht nur Java) so funktioniert, wie es funktioniert.
Wenn Sie eine Methode definieren setCoordinates(int x, int y)
, erwarten Sie nicht, dass der Compiler automatisch eine parameterlose Version davon akzeptiert setCoordinates()
. Es würde nichts tun.
Wie unterscheidet sich dies von der Erwartung eines parameterlosen Konstruktors? Nun, offensichtlich macht ein Konstruktor immer mindestens eine Sache - er erstellt ein Objekt (oder stirbt beim Versuch).
Aber ich möchte die Kontrolle darüber haben, wie meine Objekte instanziiert werden sollen. Wenn ich gezwungen werde, einen parameterlosen Konstruktor zu haben, egal was ich tue, wird mir diese Kontrolle genommen.