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
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.
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!