Quando usar o instanceof?

6 respostas
J

Criei uma interface chamada Compactador, com isso implementei a mesma para classes Zip e Rar, mas não entendi o objetivo de utilizar o instanceof neste contexto?
Se sestiver errado, quando seria mais apropriado?
Obrigado

6 Respostas

A

O instanceof serve para saber se alguma variavel de referencia é de determinado tipo.

Ex:

Carro c = new Carro();
if(c instanceof Carro) {
//faz coisas aqui
}
V

Vou dá outro exemplo;

class Humano {
}
class Pessoa extends Humano {

}
class Victor extends Pessoa {
   public static void main(String[] args) {
       Victor v = new Victor();
        if(v instanceof Humano) {
           System.out.println("Victor é um humano");
      }
    
   }
}

Humano -> Pessoa É-UM Humano -> Victor É-UMA Pessoa -> Victor É-UM Humano

Deu para entender ?

H

Só detalhando um pouco mais

O instanceof verifica se alguma coisa é uma instancia de outra coisa.
Se for, retorna true, se não false.

Usando o exemplo do amigo acima :

class Carro {
 //Atributos e metodos

}

class Subaru extends Carro{
//atributos e metodos
}

class Mercedes extends Carro{
//atributos e metodos
}

ai vc pode fazer

Carro c = new Subaru();

        if (c instanceof Subaru){
            System.out.println("True");
        }else{
            System.out.println("false");
        }

// vc verificou se o seu carro é um subaru e neste caso é true
Agora se vc fizer assim:
Carro m = new Mercedes();

        if (m instanceof Subaru){
            System.out.println("True");
        }else{
            System.out.println("false");
        }

//Essa vai imprimir false porque mercedes não é um subaru

E assim:

Carro s = new Subaru();
Carro m = new Mercedes();

        if (m instanceof Carro){
            System.out.println("True");
        }else{
            System.out.println("false");
        }


//Neste caso qualquer um vai dar true, porque tanto mercedes quanto subaru são carros

Espero que tenha dado pra entender.

Abraços

O

Uma vez explicado o que é, adiciono o seguinte:

Como diz um amigo meu: Tudo de mais é muito! Então eu não vou dizer “nunca”, mas evite usar instanceof. Aliás, evite condicionais. Use um conceito muito mais poderoso de OO: polimorfismo.

BTW, não sou quem diz isso, é só um carinha irrelevante chamado Martin Fowler.

Tem toda uma campanha em cima disso: http://www.antiifcampaign.com

F

ozix:
Uma vez explicado o que é, adiciono o seguinte:

Como diz um amigo meu: Tudo de mais é muito! Então eu não vou dizer “nunca”, mas evite usar instanceof. Aliás, evite condicionais. Use um conceito muito mais poderoso de OO: polimorfismo.

BTW, não sou quem diz isso, é só um carinha irrelevante chamado Martin Fowler.

Tem toda uma campanha em cima disso: http://www.antiifcampaign.com

Pois é eu ia falar exatamente isso, agora do carinha irrelevante eu ri :slight_smile:

G

Bom, acho que ficou bem explicada a função do instanceof.

Mas complementando, talvez você queira saber como pode ser útil no seu caso. Eu particularmente acho que não haverá necessidade de utilizar. :frowning:

Tem razão, e felizmente é exatamente isso que ele está fazendo.
O jeito mais feio seria:

if(formato == ZIP) {
 // Escreve toda a rotina de 1000 linhas para compactar zip...
} else if (formato == RAR) {
 // Escreve toda a rotina de 1000 linhas para compactar rar...
}

Usando polimorfismo:

Compactador compact = ..... // Obtem de alguma fabrica - ou tambem pode ser injetado
  compact.compactar(conteudo); // O compactador já sabe o que fazer

Veja que a segunda maneira se aproxima mais do que o autor do tópico fez… no fundo uma implementação do padrão Strategy.
Muito bom!

Criado 27 de agosto de 2010
Ultima resposta 27 de ago. de 2010
Respostas 6
Participantes 7