InstanceOf?

13 respostas
cafezin

Boa tarde pessoal,

Lá vai uma dúvida de OO e Java.

Qual a melhor maneira de eu descobrir qual tipo de objeto que estou trabalhando, sabendo que ele foi herdado de uma superclasse? Por exemplo:
public class SuperClasse {

	String name;
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
E tenha por exemplo 3 classes que herdam.
public class A extends SuperClasse {}
public class B extends SuperClasse {}
public class C extends SuperClasse {}
Dado que eu tenha a instância de um objeto com o tipo SuperClasse. Qual a melhor maneira de eu saber se ela é a uma instância de "A", "B" ou "C" ?

instanceOf ? Em seguida fazer ifs e aplicar casts para cada caso?
Ou existe algo mais interessante? Ou estou falando um monte de besteiras?

Obrigado a quem colaborar

13 Respostas

Almeidaah

Bem, eu acho que o instanceOf é bem significativo nesse sentido, aliás, é o único que conheço nesse caso.

Eu sempre(quase sempre) uso o instanceOf para reconhecimento de objetos.
Fico aqui no aguardo de mais respostas também.

cafezin
Pensei em criar um ENUM na super classe.
public class SuperClasse{
...
public enum SuperClasseType {A, B, C}

public SuperClasseType getType() {
		return type;
	}
public void setType(SuperClasse type) {
		this.type = type;
	}
...
}
Mas sabe aquela voz que te diz: "Isso é gambiaaaarra" Então.. sei lá
tinorberto

ola, use o instaof mesmo…

SuperClasse a = new A();
        SuperClasse b = new B();
	
		if(a instanceof A)
			System.out.print("Instancia de A");

Bem assim acho q fica bem simples…flw

Almeidaah

cafezin

É, o enum não é legal, alguns mais entendidos te diriam que “não fica elegante”…

Vai de instanceof mesmo.
E aproveita e cria um getInstance nessas suas subclasses(se vc for usar efetivamente).

:lol:

pmlm

E porque é que tens de saber qual é o tipo da subclasse?

tinorberto

usar enum é gambiarra para isso…

cafezin

pmlm:
cafezin:

Qual a melhor maneira de eu descobrir qual tipo de objeto que estou trabalhando, sabendo que ele foi herdado de uma superclasse?

E porque é que tens de saber qual é o tipo da subclasse?

// chamando o mesmo método com parâmetros diferentes
void metodo(a);
void metodo(b);
void metodo(c);
...
metodo(SuperClasse superClasse) {
superClasse. // pq aqui posso usar os métodos que cada uma tem(que não são em comum).
}
pmlm

Podes dar um exemplo concreto?

P

faz assim

if(objeto instanceof A) { ... }
talvez não seja a melhor maneira mas é eficaz e é a que eu conheço

cafezin

paty_trind:
faz assim

if(objetoDestaClasse instanceof ObjetoDeOutraClasse) { ... }

instanceOf ? Em seguida fazer ifs e aplicar casts para cada caso?
Ou existe algo mais interessante?

pmlm

cafezin:
instanceOf ? Em seguida fazer ifs e aplicar casts para cada caso?
Ou existe algo mais interessante?

Se deres um exemplo concreto pode haver algo mais interessante.

O que querias dizer atrás com os métodos não serem comuns?

class A {
    void fazAlgo(){
        System.out.println("classe A a fazer algo");
    }
}


class B extends A {
   void fazAlgo(){
        System.out.println("classe B a fazer algo diferente");
    }
}


class C extends A {
   void fazAlgo(){
        System.out.println("classe C faz também diferente");
    }
}


....
 void metodo(a);  
 void metodo(b);  
 void metodo(c);  
 ...  
 metodo(SuperClasse superClasse) {  
     superClasse.fazAlgo(); //vai chamar os metodos respectivos das sublasses
 }
cafezin

Entendi. É isso mesmo.
no caso o fazAlgo() poderia ser abstrato também né, na SuperClasse.

pmlm

Sim, o método tem de existir na superclasse, ou como abstrato ou com lógica, consoante a situação.

Criado 5 de abril de 2011
Ultima resposta 6 de abr. de 2011
Respostas 13
Participantes 5