Sobrescrição de método anonimamente

4 respostas
Gustavo_Martins_de_S

Olá a todos,

Surgiu uma dúvida sobre um caso estranho aqui no trabalho e gostaria de perguntar o conceito por trás do que ocorreu.

O caso é o seguinte.

Eu possuo a classe UsuarioBO e em um método dela está instanciado um objeto de OptionValue, entretanto este OptionValue possui a seguinte declaração de instância.

new OptionValue() {

<a class="mention" href="/u/override">@Override</a>

public String toString(){

super.getLabel();

}

};

O que ocorreu foi o seguinte: por alguma razão, a instância de OptionValue acabou milacurosamente virando uma instância de UsuarioBO, portanto quando comparado dois OptionValue usando o método .equals(), ele sempre retornava false.

Gostaria de saber se há alguma razão aparente por trás desse ocorrido.

4 Respostas

drsmachado

milacurosamente??? Você quis dizer: milagrosamente
milacurosamente??? Você quis dizer: miraculosamente

Camarada, posta os códigos das classes, para que possamos entender o contexto em que isto está ocorrendo.

Gustavo_Martins_de_S

AHEHAEHAE troquei um r por um l, acontece :lol:

public class UsuarioBO {

//Códigos//

public OptionValue metodoQualquer(){
OptionValue ov = new OptionValue() {
@Override
public String toString(){
super.getLabel();
}
}; 
return ov;
}

public static void main(args[]){
OptionValue ov = new Main().metodoQualquer();
OptionValue ov2 = new OptionValue();
ov.equals(ov2);
}

}

Coloquem qualquer classe no lugar do OptionValue e debuguem pra ver no que a variável ov se transforma depois de instanciada.

programadora
public class UsuarioBO {

	// Códigos//

	public OptionValue metodoQualquer() {
		OptionValue ov = new OptionValue() {
			@Override
			public String toString() {
				return super.getLabel();
			}
		};
		return ov;
	}

	public static void main(String args[]) {
		OptionValue ov = new UsuarioBO().metodoQualquer();
		OptionValue ov2 = new OptionValue();
		System.out.println("Instancia de Option Value: "+(ov instanceof OptionValue));
		System.out.println("OV: "+ov);
		System.out.println("OV2: "+ov2);
	}

}

class OptionValue {
	public String getLabel() {
		return "123";
	}
	
	public boolean equals (Object obj){
		if (obj instanceof OptionValue)
			return this.getLabel().equals(((OptionValue)obj).getLabel());
		return false;
	}
	public String toString() {
		return getLabel();
	}
}

Oi, ajustei alguns códigos que não tavam compilando e adicionei umas coisinhas a mais, como a susbcrição do método equals.
Em momento algum a variável de instância de “ov” vira um UsuarioBO… Ele cria dois objetos do tipo OptionValue, um que foi criado dentro do método “metodoQualquer()” e outro criado dentro do próprio Main.
Se você fizer o teste com o operador instanceof verá que ov e ov2 são ambos instâncias de OptionValue.
O que pode ter acontecido, é que você comparou dois objetos com equals sem sobrescrevê-lo na classe OptionValue e, desta forma, ao realizar a comparação com o equals, como os dois possuem instâncias diferentes, ou seja, não apontam para a mesma instância na memoria, o método retorna false.
Não sei se consegui ser clara, qualquer coisa falaê!!

vlw!

WellingtonRamos

Gustavo Martins de Souza:
O que ocorreu foi o seguinte: por alguma razão, a instância de OptionValue acabou milacurosamente virando uma instância de UsuarioBO, portanto quando comparado dois OptionValue usando o método .equals(), ele sempre retornava false.

Gostaria de saber se há alguma razão aparente por trás desse ocorrido.


Por acaso essa “transfomação” você viu no debug ou fazendo teste de instanceof?
Se foi no debug, é provável que você tenha visto UsuarioBO$1 que indica que UsuarioBO possui uma classe anônima indexada com 1.

Seu OptionValue sobrescreve o método equals?

Criado 21 de setembro de 2011
Ultima resposta 21 de set. de 2011
Respostas 4
Participantes 4