Quando usar o instanceof?

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

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
}

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 ?

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 :

[code]class Carro {
//Atributos e metodos

}

class Subaru extends Carro{
//atributos e metodos
}

class Mercedes extends Carro{
//atributos e metodos
}
[/code]

ai vc pode fazer

[code]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
[/code]
Agora se vc fizer assim:

[code]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
[/code]

E assim:

[code]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[/code]

Espero que tenha dado pra entender.

Abraços

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

[quote=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[/quote]

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

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!