Utilizar método não final em construtor

2 respostas
sephil

Bom dia pessoal,

Estava lendo sobre os problemas que um método não final, ou não privado, poderia causar se fosse utilizado em um construtor.
Li este tópico http://www.guj.com.br/java/56088-posso-chamar-outros-metodos-no-meu-construtor-resolvido onde é dito que o comportamento de uma classe pode ser alterado, quando uma subclasse sobrescreve o método em questão e pode tentar utilizar um atributo que ainda não foi instanciado.

Sabendo que os atributos de instancia de uma classe possuem valores default quando não inicializados, e que ao instanciar uma subclasse, o construtor da classe pai é executado antes, realizando todas as regras de negócio necessárias para a correta inicialização do objeto, eu pergunto: Qual problema pode ser causado se alguém sobrescrever um método não final utilizado no construtor da classe pai?

Se alguém puder postar um exemplo de um código bem simples para ficar claro o entendimento dessa questão, eu agradeço =)

Valeu!

2 Respostas

tveronezi

Interessante…

package test;

public class App {
    public static void main(String[] args) {
        System.out.println((new A()).getValue());
        System.out.println((new B()).getValue());
    }
}

class A {

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        if (value == null) {
            this.value = "a";
        } else {
            this.value = value;
        }

    }

    public A() {
        setValue("a");
    }


}

class B extends A {

    public void setValue(String value) {

    }

}

system.out >>
a
null

Vc pode salvar o código ao definir “setValue” como “private” ou como “final”.

sephil

O que ocorre é isso mesmo, se alguém sobrescrever o método em questão e alterar o comportamento dele, pode fazer com que o objeto fique inconsistente (no caso do seu exemplo, o atributo ficou nulo).
Isso ocorre porque quando você instancia uma subclasse, ela vai executar o construtor da classe pai, e ao encontrar o método sobrescrito dentro do construtor, ele verifica que você o sobrescreveu, e por isso, prefere usar a sua implementação ao invés da original, o que causa grandes problemas.
Tornando o método final ou private, o método não poderá ser sobrescrito, eliminando assim este problema =D

Obrigado pela luz o/

Criado 27 de junho de 2012
Ultima resposta 27 de jun. de 2012
Respostas 2
Participantes 2