Bem pessoal,
Referência é como um terror assolando os códigos do Java, é ótimo ter referência nos objeto e trabalhar com elas… mas é perigoso ao mesmo tempo. A String e os Numbers provam isso a cada dia, como pode ser complicado trabalhar com o operador mágico e confuso “==”.
Como isso é confuso não? Com String nunca se usa o ==, mas nunca mesmo. Mas por que?
Toda string criada é guardada em um pool de strings na jvm, mas as referências mudam e como mudam.
– “aa” == “aa”, false.
– “aa”.equals(“aa”), true.
E quando falamos de inteiros? Ai complica…
– 1 == new Integer(1), true.
– 1 == 1, true.
– new Integer(1) == new Integer(1), false.
– new Integer(1).equals(new Integer(1)), true.
Mesmo vale para todos os outros Number’s.
Outra observação extremamente importante é:
Quando temos polimorfismo, ou seja:
public static boolean equals(Object o) {
return o.equals(new Integer(1));
}
public static void main(String[] args) {
System.out.println(equals(new Integer(1)));
}
Qual é o retorno desse método? FALSE!!!!
Isso em termos é um completo absurdo, deveria retornar de acordo com a classe final, mas enfim, não funciona. Se usar Generics funciona.
Então para constar, esse é o tipo de resultado que pode complicar e muito na hora de debbugar um código por se tratar de um erro complicado de se encontrar…
Fiquem ligados 🙂