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.
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.
Coloquem qualquer classe no lugar do OptionValue e debuguem pra ver no que a variável ov se transforma depois de instanciada.
programadora
publicclassUsuarioBO{// Códigos//publicOptionValuemetodoQualquer(){OptionValueov=newOptionValue(){@OverridepublicStringtoString(){returnsuper.getLabel();}};returnov;}publicstaticvoidmain(Stringargs[]){OptionValueov=newUsuarioBO().metodoQualquer();OptionValueov2=newOptionValue();System.out.println("Instancia de Option Value: "+(ovinstanceofOptionValue));System.out.println("OV: "+ov);System.out.println("OV2: "+ov2);}}classOptionValue{publicStringgetLabel(){return"123";}publicbooleanequals(Objectobj){if(objinstanceofOptionValue)returnthis.getLabel().equals(((OptionValue)obj).getLabel());returnfalse;}publicStringtoString(){returngetLabel();}}
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.