Metodo Recursivo

6 respostas
L

Alguem conhece um bom metodo recursivo q faça chamadas colhedo informações por toda a hierarquia de um objeto ( passando para outro objeto e assim vai ) ?

Leonardo Schmitt

6 Respostas

marcioa1

Estude o pattern Composite

Márcio

pcalcado

Nao entendi, Marcio…

Pelo que entendo, o que ele quer eh ir descobrindo a hierarquia de objetos. Reflection 101 :wink:

L

é o seguinte eu tenho dois objetos de mesma classe, o codigo abaixo pega os dois objetos e compara seus metodos get´s e is´s me informando em uma mensagem os seus metodos iguais podem testar se quiserem para ver como funciona , mas, o q eu quero agora é no final por um ultimo else como… e se for um outro objeto e não um tipo primitivo como vou lá no outro objeto da hierarquia e buscar os seus metodos?

public class ClasseTeste {

	String nome;
	long i;
	int y;
	boolean flag;
	
	public boolean isFlag() {
		return flag;
	}
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	public long getI() {
		return i;
	}
	public void setI(long i) {
		this.i = i;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
}
import java.lang.reflect.*;

public class CompareObjetos 
{
	public static void main( String args[] )
	{
		ClasseTeste o1, o2;
		o1 = new ClasseTeste();
		o2 = new ClasseTeste();
		compare(o1, o2);
	}
	
	public static int compare( Object o1, Object o2 )
	{
		Method[] umaListaMetodos = o1.getClass().getDeclaredMethods();
		boolean ehDiferente = false;
		
		for( int i = 0; i < umaListaMetodos.length; i++ )
		{
			if( umaListaMetodos[i].getName().startsWith("get") || umaListaMetodos[i].getName().startsWith("is") )
			{
				try {
					Class umaClasse = umaListaMetodos[i].getReturnType();
					Object objRetornado1 = umaListaMetodos[i].invoke(o1, null );
					Object objRetornado2 = umaListaMetodos[i].invoke(o2, null );
					
					if( !objRetornado1.equals( objRetornado2 ) )
						return 1;
					
					else if( umaClasse == int.class ){
						ehDiferente = true;
						System.out.println( "Metodo: "+umaListaMetodos[i].toGenericString() );
						
					}else if( umaClasse == String.class ){
						ehDiferente = true;
						System.out.println( "Metodo: "+umaListaMetodos[i].toGenericString() );
					
					}else if( umaClasse == long.class ){
						ehDiferente = true;
						System.out.println( "Metodo: "+umaListaMetodos[i].toGenericString() );
					
					}else if( umaClasse == double.class ){
						ehDiferente = true;
						System.out.println( "Metodo: "+umaListaMetodos[i].toGenericString() );
					
					}else if( umaClasse == short.class ){
						ehDiferente = true;
						System.out.println( "Metodo: "+umaListaMetodos[i].toGenericString() );
					
					}else if( umaClasse == byte.class ){
						ehDiferente = true;
						System.out.println( "Metodo: "+umaListaMetodos[i].toGenericString() );
					
					}else if( umaClasse == char.class ){
						ehDiferente = true;
						System.out.println( "Metodo: "+umaListaMetodos[i].toGenericString() );
					
					}else if( umaClasse == boolean.class ){
						ehDiferente = true;
						System.out.println( "Metodo: "+umaListaMetodos[i].toGenericString() );
					
					}else if( umaClasse == float.class ){
						ehDiferente = true;
						System.out.println( "Metodo: "+umaListaMetodos[i].toGenericString() );
					}
				}
				catch( Exception e ){ e.printStackTrace(); }
			} //else aqui para fazer recursao se for objeto
		}
		return 1;
	}

}
L

botei o else no local errado é mais acima claro :lol:

marcioa1

Shoes,

Eu estava envolvido com meu problema e achei que o dele era parecdio. Estou varrendo uma árvore e buscando um total.

Foi mal amigos,

Márcio

T

Só tome cuidado com ciclos :wink:

Por exemplo, o seu método recursivo tem de tomar cuidado com este conjunto de classes:

class Class1 {
    public Class3 class3 = new Class3();
}

class Class2 {
    public Class1 class1 = new Class1();
}

class Class3 {
    public Class2 class2 = new Class2();
}

class TestRecursive {
    public static void main(String[] args) {
        Class3 class3 = new Class3();
    }
}

(a propósito, se você executar java -cp . TestRecursive, o que ocorre?)

Criado 8 de julho de 2005
Ultima resposta 8 de jul. de 2005
Respostas 6
Participantes 4