O Java que gera um construtor sem parâmetros quando você não tem outro é como um garçom educado levando seu casaco para você.
O Java ainda está gerando um construtor sem parâmetros depois que você define outra versão, é como o mesmo garçom tirando o casaco depois de dar uma indicação clara de que você tem seus próprios planos do que fazer com o casaco.
Se eu tiver uma classe (que eu quero ser imutável):
class Person
{
final String firstName;
final String lastName;
E eu adiciono um construtor:
Person(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
E o Java ainda precisava fornecer um construtor padrão, sem parâmetros, então esse código não pode ser compilado, porque firstName
e os lastName
campos são declarados como finais, mas não são definidos após a chamada Person p = new Person()
.
Você está me forçando a fornecer outra implementação:
private Person()
{
this.firstName = null; // or "", or whatever
this.lastName = null;
}
E como eu não quero - como é inútil, posso me sentir inclinado a colocar caveiras e ossos cruzados:
@Deprecated
private Person()
{
// don't use this constructor! i don't want it to ever be called!
throw new RuntimeException("Illegal constructor called");
}
Mas ainda não posso proibir outro desenvolvedor de criar um método (dentro da Person
classe, marcar o construtor como privado não ajudou):
public static Person createPerson()
{
return new Person(); // this will blow in our face
}
Todo esse barulho pode ser - e é - evitado graças ao fato de que o Java (e não apenas o Java) funciona da maneira que funciona.
Se você definir um método setCoordinates(int x, int y)
, não espera que o compilador aceite automaticamente uma versão sem parâmetros - setCoordinates()
. Não faria nada.
Como isso é diferente de esperar um construtor sem parâmetros? Bem, obviamente, um construtor sempre faz pelo menos uma coisa - ele cria um objeto (ou morre tentando).
Mas eu gosto de controlar como quero que meus objetos sejam instanciados. Forçar-me a ter um construtor sem parâmetros, não importa o que eu faça, tira esse controle de mim.