Início‎ > ‎

Não comparar classes por nome

Em algumas situações pode ser necessário verificar se dois objetos são instâncias da mesma classe. Como a máquina virtual permite que classes diferentes tenham o mesmo nome (se estiverem em pacotes diferentes), a comparação não deve ser feita com base no nome das classes.

Caso a comparação deva ser feita com base no nome da classe (por exemplo, para verificar se o objeto é da classe Foo), deve-se proceder como o exemplo a seguir:

if(obj.getClass() == this.getClassLoader().loadClass("com.bar.Foo")){
  // a classe do objeto é "com.bar.Foo"
} else {
  // a classe do objeto não é a classe que
  // esta aplicação chama de "com.bar.Foo"
}

É importante notar que esta comparação funciona na maioria dos casos, já que a JVM normalmente usa o mesmo classloader para todas as classes de uma aplicação. No entanto, podem ocorrer problemas nos casos em que a classe seja:

  1. carregada como extensão do Java;
  2. carregada a partir de um serviço remoto.

Caso seja necessário verificar se dois objetos são instâncias da mesma classe, o código abaixo pode ser usado:

if(a.getClass() == b.getClass()){
  // objetos são da mesma classe
} else {
  // objetos são de classes diferentes
}

Comments