04 março 2009

SCJP - 02 - Mais sobre Construtores

Dessa vez a gente vai sacanear! :D Vamo lá experimentar mais uma das coisas que talvez eu nunca tivesse parado pra pensar, descritas no livro da certificação. Antes de mais nada, precisamos lembrar que:

O compilador sempre irá inserir uma chamada a super(), como primeira instrução de qualquer construtor, a menos que já exista uma chamada a this().




Agora olhem a seguinte sacanagem:

class Teste {
    Teste(String teste){
        this();
    }

    Teste() {
        this("teste");
    }
}

public class Principal {
    public static void main(String[] args) {
        Teste teste = new Teste();
    }
}

Vocês podem até compilar... O livro fala que talvez o compilador java deixe isso passar. Se isso acontecer, eu não aconselharia a tentar rodar isso não... Logo de cara, a gente olha o código e pensa: puts, que coisa idiota! claro que isso é um loop infinito! Mas logo depois a gente para e lembra daquela premissa: nada é o que parece ser.

Daí a gente lembra que o compilador insere coisas implicitamente, como primeira instrução de cada construtor. Opa, exceto se já houver uma chamada a this()! Bem, como não existem outros construtores na classe, e todos eles tem uma chamada a this(), o compilador não pode fazer nada. E como ambos os construtores chamam um ao outro, nós, novamente, pensamos: puts, que coisa idiota! Isso é um loop infinito! Tá, tá, não necessariamente um loop infinito, mas uma recursão que só acaba com um estouro de pilha.

Mesmo que houvesse um terceiro construtor, que não fizesse uso da chamada this() (e como consequência, fizesse uso de uma chamada a super(), explicitamente ou não), se um dos dois outros construtores fossem utilizados na instanciação de objetos, o mesmo pau aconteceria.

Testei aqui com o java 6. Sem parametros. Não compilou. Dai eu decidi usar alguns parametros pra testar:

javac -source 1.5 Principal.java
javac -source 1.4 Principal.java

O resultado foi sempre o mesmo, exibido abaixo:


Creative Commons License
Esta obra está licenciada sob uma Licença Creative Commons.
Comentários
0 Comentários

0 comments:

Postar um comentário

Regras são chatas, mas...

- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;