Retorno no construtor - treino para a certificação Java
Estive me preparando para a certificação da Oracle e surgiu a seguinte situação:
Vamos verificar a classe Livro:
public class Livro {
public Livro(String nome, double valor){
System.out.println("nome: " + nome);
System.out.println("preco: " + valor); // resto do código
}
}
Agora se eu testar o meu código:
Livro livro = new Livro("Certificação Java", 35.00);
Resultado:
> nome: Certificação Java preco: 35.0
Funciona como o esperado. Analisando um pouco o nosso código... Podemos ver que o nosso construtor não retorna nada, e em Java quando um método não retorna nada é void
, então que tal criarmos um novo construtor com um retorno void
?
public class Livro {
public void Livro(String nome){
System.out.println("nome: " + nome);
}
public Livro(String nome, double valor){
System.out.println("nome: " + nome);
System.out.println("preco: " + valor);
}
}
Agora vamos criar um livro que tenha apenas um nome:
Livro livro = new Livro("Certificação Java");
Ué? Não compilou? Que estranho...
Main.java:4: error: constructor Livro in class Livro cannot be applied to given types;
Em tempo de compilação o construtor não é um método! Por isso não podemos retornar valores, ou seja, não podemos assinar como void
, int
ou qualquer valor em específico,mesmo sabendo que, por de baixo dos panos (em bytecode), ele é um método. Para diferenciar com mais facilidade podemos pensar o seguinte:
O construtor é um "tipo de método" sem nome que retorna a própria classe:
//tem apenas o nome da classe. Livro () {
}
Podemos pensar dessa forma para facilitar a compreensão, porém NUNCA confunda método com construtor... (apesar de, bem debaixo dos panos, no bytecode, o construtor é representado como um método que é invocado após o objeto ser criado, um tópico bemmm avançado). Sabemos que métodos, mesmo sendo void
, possuem o return
, mas e os construtores? Também possuem! Vamos adicionar um return
no construtor:
//return vazio. Livro () { return; }
Porém, o return
do construtor não pode retornar nada! Legal, ele tem um retorno que não retorna, então por qual motivo eu usaria um retorno desse? Simples! Usamos esse tipo de retorno para interromper o construtor se for necessário, por exemplo, vamos criar um construtor que só recebe o valor:
Livro (double valor) {
}
E se o valor for menor ou igual a 1000 quero apenas atribuir e se for maior eu preciso aplicar várias regras de impostos e depois atribuir:
public Livro(double valor) {
if (valor <= 1000) {
this.preco = valor;
return;
}
double taxa = 0.30;
if (valor > 1000 && valor < 1500) {
taxa = 0.10;
} else if (valor >= 1500 && valor <= 2000) {
taxa = 0.15;
} this.preco = taxa * valor;
}
Vejam que no momento em que o valor é menor ou igual a 1000 temos o return, ou seja, todo o código abaixo não será executado! Parece bizarro, porém funciona!
E aí, o que achou do retorno do construtor? Nem fazia ideia que existia? Pensando nisso o instrutor Guilherme Silveira criou a formação de certificação Java que aborda com muitos detalhes todas as peculiaridades que podemos encontrar na linguagem Java, com o intuito de preparar o aluno para a certificação da Oracle!