Java que genera un constructor sin parámetros cuando no tienes otro es como un camarero educado que toma tu abrigo por ti.
Java sigue generando un constructor sin parámetros después de definir otra versión del mismo, es como si el mismo camarero le quitara el abrigo después de dar una clara indicación de que tiene sus propios planes de qué hacer con el abrigo.
Si tengo una clase (que quiero ser inmutable):
class Person
{
final String firstName;
final String lastName;
Y agrego un constructor:
Person(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
Y Java era todavía para proporcionar un constructor por defecto, sin parámetros, a continuación, este código no puede compilar, porque firstName
y lastName
campos son declarados como final, sin embargo, no se establecen después de su llamada Person p = new Person()
.
Me estás obligando a proporcionar otra implementación:
private Person()
{
this.firstName = null; // or "", or whatever
this.lastName = null;
}
Y como no lo quiero, ya que es inútil, me siento inclinado a ponerle calavera y huesos cruzados:
@Deprecated
private Person()
{
// don't use this constructor! i don't want it to ever be called!
throw new RuntimeException("Illegal constructor called");
}
Pero todavía no puedo prohibir a otro desarrollador que cree un método (dentro de la Person
clase, por lo que marcar el constructor como privado no ayudó):
public static Person createPerson()
{
return new Person(); // this will blow in our face
}
Todo este alboroto podría evitarse, y se evita, gracias al hecho de que Java (y no solo Java) funciona de la manera en que funciona.
Si define un método setCoordinates(int x, int y)
, no espera que el compilador acepte automáticamente una versión sin parámetros del mismo setCoordinates()
. No haría nada.
¿Cómo es esto diferente de esperar un constructor sin parámetros? Bueno, obviamente, un constructor siempre hace al menos una cosa: crea un objeto (o muere en el intento).
Pero me gusta tener el control de cómo quiero que se instancian mis objetos. Obligarme a tener un constructor sin parámetros, no importa lo que haga, me quita este control.