Negocio

Como usar o operador InstanceOf em Java

O que eu sou?

Há momentos em que precisamos saber qual tipo de dado é um determinado objeto, ou se um objeto é de um certo tipo (por exemplo, se Apple é um tipo de pizza ou árvore). A palavra-chave Java instanceof é usada para esses testes; ele compara o objeto com um determinado tipo. Instanceof retorna apenas TRUE ou FALSE.

Isso ajuda a ver o código em ação, então vamos dar uma olhada em alguns exemplos de código para que possamos ver como essa palavra-chave é usada. Abaixo está um exemplo da palavra-chave. Declaramos um objeto String e, em seguida, usamos instanceof para determinar se o objeto é uma string.

public static void main (String [] args) { 
  String what = "O que sou?";
  if (what instanceof java.lang.String) {
   System.out.println (what = "is a String");
  }
}

E a saída:

java instanceof basic output

Uma observação importante sobre um valor nulo!

Se a variável ou objeto for NULL (sem valor), instanceof retornará FALSE. Não importa se a variável é realmente uma instância de uma pizza; se de alguma forma foi alterado para NULL, seu teste falhará.

Aqui está outro teste útil, por exemplo. Digamos que criamos uma matriz de Strings em vez de uma String padrão. O objeto não é mais uma String e instanceof retornará false. Se quisermos verificar se um objeto é uma matriz String, podemos usar a palavra-chave da seguinte maneira:

public static void main (String [] args) { 
  String [] myString = {
   "Seven",
   "Eight",
   "Nine"
  }
  if (myString instanceof String []) {
   System.out.println ("Object is String Array & quot) ;
  }
}

E a saída:

Instância Java de teste para saída de array

Teste de Objeto

Agora, é bastante óbvio que nosso objeto é uma String! Mas lembre-se de que Java é orientado a objetos, e instanceof pode ser muito útil ao testar nossas próprias classes.

Digamos que temos uma classe chamada Rhubarb e criamos uma nova instância dela. Para verificar se a classe é realmente uma instância de Rhubarb, podemos usar o seguinte:

Ruibarbo r = novo Ruibarbo (); 
if (r instanceof Rhubarb) {
  // true
}

Na maioria das vezes, você saberá que Ruibarbo é um objeto do tipo Torta. Mas e quanto a Birch? É uma classe filha de Tree ou BoysName? Abaixo está um snippet de um programa Java que verifica se o Raptor é realmente um objeto da classe Dinosaur (em oposição a um veículo ou alguma outra classe).

System.out.println (instância raptor de Dinosaur);

Outro uso para instanceof é quando estamos fazendo downcast de objetos.

Downcasting

Java permite lançar UP. Em nosso caso, Rhubarb é uma classe filha de Pie. Mas você pode fazer upcast de Rhubarb para ser uma instância de pizza. Ele perde todas as suas qualidades de ruibarbo, mas pode se tornar uma torta. Quando terminarmos, podemos fazer o downcast , ou seja, lançá-lo de volta ao Ruibarbo:

Ruibarbo ruibarbo = novo ruibarbo (); 
// transformado em torta
Torta torta = ruibarbo;
// lançada de volta para Rhubarb
Rhubarb rhubarb2 = (Rhubarb) torta;

O upcasting geralmente não é um grande negócio, já que (em nosso código) Ruibarbo sempre será uma Torta. O problema é quando você tenta reduzir uma torta a um ruibarbo e é realmente uma maçã. Nem todas as tortas são ruibarbo!

Se fizermos o upcast de uma maçã para uma torta, em seguida, tentarmos fazer o downcast para ruibarbo, ele irá compilar:

Maçã maçã = maçã nova (); 
Torta de torta = maçã;
// lançado em Rhubarb
Rhubarb rhubarb = (Rhubarb) pie;

No entanto, ele falhará em tempo de execução:

erro de tempo de execução java downcast

A solução é usar instanceof para garantir que podemos prosseguir. Vamos nos certificar de que a torta seja ruibarbo antes de descermos de volta. Anote o código, pois desta vez fizemos upcast de Rhubarb para Pie; em seguida, verificamos se está tudo bem para fazer o downcast.

Torta de torta = ruibarbo; 
// certifique-se de que é ruibarbo!
if (instância da pizza de Rhubarb) {
  System.out.println ("OK!");
  Ruibarbo ruibarbo2 = torta de (ruibarbo);
} else {
  System.out.println ("Rhubarb NÃO é Apple!");
}

Resumo da lição

A palavra-chave Java instanceof é usada para verificar se um objeto é de um determinado tipo. Ele retorna verdadeiro ou falso. Por exemplo, podemos verificar se uma variável é um tipo de String; podemos testar classes para ver se são de certos tipos (por exemplo, é um Birch a Tree ou um BoysName?). Você pode usar instanceof ao fazer downcast de classes para ter certeza de que pode realmente fazer downcast de uma árvore para um vidoeiro (certifique-se de que já não seja um bordo).