[quote=celso.martins]Porque utilizar instanceof e typecast é considerado má-prática?
Como funciona Integer.parseInt? Ele não faz um typecast?
Pergunto devido a esse trecho:
if (nodeList.get(i) instanceof GroupNode){
openGroupNodes.add(nodeList.get(i));
}
A estrutura é mais ou menos essa:
Classe Node abstrata com InternalNode e GroupNode como filhos. Como posso eliminar esse instanceof.
[/quote]
Pela sua descrição parece que está usando o padrão composite.
Parece-me tb que vc quer adicionar os nodos apenas se são grupos , ou seja, se não são folhas.
Existem duas formas para resovler isto:
- colocar um booleano em Nodo
abstract class Nodo{
public abstract boolean isGroup();
}
class InternalNode exends node{
public final boolean isGroup(){ return false}
}
class GroupNode exends node{
public final boolean isGroup(){ return true}
}
- colocar um inteiro em Nodo
abstract class Nodo{
public abstract int childrenCount();
}
class InternalNode exends node{
public final int childrenCount(){ return 0}
}
class GroupNode exends node{
public final int childrenCount(){ return this.listaSubNodos.getSize()}
}
A primeira forma é mais especifica e permite fazer algo como
if (nodeList.get(i).isGroup()){
openGroupNodes.add(nodeList.get(i));
}
Mas de certa forma viola o encapsulamento e o padrão composite. Não que não seja possivel
é um trade-off se realmente não existir outra opção. Isto é usado por exemplo no nodos do Swing do JTree
A segunda forma é menos obvia
if (nodeList.get(i).childrenCount()>0){
openGroupNodes.add(nodeList.get(i));
}
E funciona apenas no contexto. Não estamos realmente destinguindo que o nodo é de grupo, mas se ele contém mais nodos.
(apenas se for de grupo contem nodos, mas memso sendo de grupo pode ter zero nodos)
O ponto é que se isto é parte de um algoritmo “de limpeza” não é necessário guardar os nodos de grupo que têm zero nodos filhos
e acaba funcionando melhor que o booleano. Como o nodo é suposto ter filhos não é violação do encapsulamento nem do padrão composite. É uma melhor opção em geral, embora não permite destinguir realmente os nodos grupo dos não-grupo. Esse é o trade-off.