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.