Instância Java do Operador

Instância Java do Operador

1. Introdução

Neste tutorial rápido, aprenderemos sobre o operadorinstanceof em Java.

2. Qual é o operadorinstanceof?

instanceof is a binary operator used to test if an object is of a given type. The result of the operation is either true or false. Também é conhecido como operador de comparação de tipo porque compara a instância com o tipo.

Antes decasting ser um objeto desconhecido, a verificaçãoinstanceof deve sempre ser usada. Fazer isso ajuda a evitarClassCastException em tempo de execução.

A sintaxe básica do operadorinstanceof é:

(object) instanceof (type)

Vamos ver um exemplo básico para o operadorinstanceof . Primeiro, vamos criar uma classeRound:

public class Round {
    // implementation details
}

A seguir, vamos criar uma classeRing que estendeRound:

public class Ring extends Round {
    // implementation details
}

Podemos usarinstanceof para verificar se uma instância deRing é do tipoRound:

@Test
public void givenWhenInstanceIsCorrect_thenReturnTrue() {
    Ring ring = new Ring();
    Assert.assertTrue(ring instanceof Round);
}

3. Como funciona o operadorinstanceof?

The instanceof operator works on the principle of the is-a relationship. O conceito de um relacionamento é um é baseado na classeinheritance ou na implementação da interface.

Para demonstrar isso, vamos criar uma interfaceShape:

public interface Shape {
    // implementation details
}

Vamos também criar uma classeCircle que implementa a interfaceShape e também estende a classeRound:

public class Circle extends Round implements Shape {
    // implementation details
}

O resultado deinstanceof serátrue se o objeto for uma instância do tipo:

@Test
public void givenWhenObjectIsInstanceOfType_thenReturnTrue() {
    Circle circle = new Circle();
    Assert.assertTrue(circle instanceof Circle);
}

Também serátrue se o objeto for uma instância de uma subclasse do tipo:

@Test
public void giveWhenInstanceIsOfSubtype_thenReturnTrue() {
    Circle circle = new Circle();
    Assert.assertTrue(circle instanceof Round);
}

Se o tipo for uma interface, ele retornarátrue se o objeto implementar a interface:

@Test
public void givenWhenTypeIsInterface_thenReturnTrue() {
    Circle circle = new Circle();
    Assert.assertTrue(circle instanceof Shape);
}

O operadorThe instanceof não pode ser usado se não houver relacionamento entre o objeto que está sendo comparado e o tipo com o qual está sendo comparado.

Vamos criar uma nova classeTriangle que implementaShape , mas não tem relação comCircle:

public class Triangle implements Shape {
    // implementation details
}

Agora, se usarmosinstanceof para verificar se aCircle é uma instância deTriangle:

@Test
public void givenWhenComparingClassInDiffHierarchy_thenCompilationError() {
    Circle circle = new Circle();
    Assert.assertFalse(circle instanceof Triangle);
}

Obteremos um erro de compilação porque não há relação entre as classesCircle eTriangle:

java.lang.Error: Unresolved compilation problem:
  Incompatible conditional operand types Circle and Triangle

4. Usandoinstanceof com o tipoObject

Em Java, cada classe herda implicitamente da classeObject. Portanto, usar o operadorinstanceof com o tipoObject sempre será avaliado comotrue:

@Test
public void givenWhenTypeIsOfObjectType_thenReturnTrue() {
    Thread thread = new Thread();
    Assert.assertTrue(thread instanceof Object);
}

5. Usando o operadorinstanceof quando um objeto énull

Se usarmos o operador instanceof em qualquer objeto que sejanull, ele retornaráfalse. Além disso, nenhuma verificação de nulo é necessária ao usar um operadorinstanceof.

@Test
public void givenWhenInstanceValueIsNull_thenReturnFalse() {
    Circle circle = null;
    Assert.assertFalse(circle instanceof Round);
}

6. Conclusão

Neste tutorial, aprendemos sobre o operadorinstanceof e como usá-lo. Os exemplos de código completos estão disponíveis emGitHub.