Instanciar na chamada de método

7 respostas
cafezin

Olá a todos,

Talvez eu esteja perdido, talvez eu não tenha noção do que estou falando e estou errando algum conceito bem básico.
Tentei simplificar o que estou tentando, e espero que possam me ajudar! =p

Deve ter uma solução simples ou mesmo um design patter para isso. Imagine que você tenha a seguinte classe "B" com atributos quaisquer.
public class B {
	
	String atributo1;
	boolean atributo2;
	
	public B(String atributo1, boolean atributo2) {
		this.atributo1 = atributo1;
		this.atributo2 = atributo2;
		System.out.println("Criou");
	}
}
E a classe "A" instanciasse objetos desta classe.
public class A {

	public B b1 = new B("b1", true);
	public B b2 = new B("b2", true);
	public B b3 = new B("b3", true);

	void metodoQualquer(B b) {
		System.out.println(b.atributo1 + " - " + b.atributo2);
	}
}
Quando eu instancio um objeto "A" ele automaticamente instancia os outros 3 que estão ali.
public class C {

	public static void main(String[] args) {
		A a = new A();
		
		a.metodoQualquer(a.b1);
		a.metodoQualquer(a.b2);
		a.metodoQualquer(a.b3);
	}
}
Agora imagine que a classe "A" tenha 200 objetos "b". Vão ser instanciados todos os 200 a cada "new A". Eu gostaria que, ao chamar o "metodoQualquer" eu consiga instanciar o new correto.

Resumindo: É como se eu tivesse uma massa de dados de objetos do tipo "B" e cada uma com um identificador(b1, b2, b3....). E quero executar um objeto B através deste identificador.
É possível executar desta forma?
"a.metodoQualquer(b2)"
Neste ponto ele encontraria o objeto e instanciara somente o "b2".

Console:
Criou
Criou
Criou
b1 - true
b2 - true
b3 - true

Bom.. se não entenderem eu tento explicar melhor

Abraço

7 Respostas

robertol

Explica melhor!

Ficou muito obscura sua explicação…

cafezin

Eu tenho uma MASSA DE DADOS…

public Livro livro1 = new Livro("capa-dura", "verde", "bonito");  
public Livro livro2 = new Livro("capa-mole", "roxo", "feio");  
public Livro livro3 = new Livro("capa-feia", "branco", "feio");  
public Livro livro4 = new Livro("capa-mole", "amarelo", "bonitao"); 
//e mais uns 300 Livros ...

void lerLivro(Livro livro) {
       // ... usa os atributos de um livro 
}

Existe uma maneira de eu chamar estes livros desta forma?

objetoQualquer.lerLivro(livro1);
M

Os livros podem ser repetidos? Se sim, use:

void lerLivro(List<Livro> livros) { }

Se não, use:

void lerLivro(Set<Livro> livros) { }

Ambas são coleções da Collections framework do Java. A primeira é a interface que representa a estrutura de dados lista, a segunda representa a estrutura de dados conjunto. Uma pesquisa no google lhe explicará outros detalhes =)

Henrique.tenorio
Voce poderia ultilizar as coleções e fazer assim:
public class A {  
     
       public ArrayList< B > lista = new ArrayList< B >();
       
       public  A()
       {
           for( int i = 0: i < 200; i++)
           {
               lista.add( new B("B"+i+"",true))
           }
       }//Fim do construtor
      
       void metodoQualquer(B b) {  [code]
           System.out.println(b.atributo1 + " - " + b.atributo2);  
       }  
   }//Fim da classe A  

public class C
   {  
      
        public static void main(String[] args) {  
            A a = new A();  
              
            a.metodoQualquer(a.lista.get(199));// indice de 0 a 199 = 200 B  
            
        }//FIm do metodo main  
   } //Fim da classe C
cafezin

Pois é… eu tinha pensado num HashMap… de qualquer forma não posso fugir de uma estrutura de dados.
A não ser que use um case…switch gigante ou if´s loucamente.

Mas vou tentar como disse. Obrigado

cafezin
Henrique.tenorio:
Voce poderia ultilizar as coleções e fazer assim:
public class A {  
     
       public ArrayList< B > lista = new ArrayList< B >();
       
       public  A()
       {
           for( int i = 0: i < 200; i++)
           {
               lista.add( new B("B"+i+"",true))
           }
       }//Fim do construtor
      
       void metodoQualquer(B b) {  
           System.out.println(b.atributo1 + " - " + b.atributo2);  
       }  
   }//Fim da classe A  

public class C
   {  
      
        public static void main(String[] args) {  
            A a = new A();  
              
            a.metodoQualquer(a.lista.get(199));// indice de 0 a 199 = 200 B  
            
        }//FIm do metodo main  
   } //Fim da classe C

No caso... não gostaria de saber o índice... acho que a solução do marcio_gs se encaixa melhor. Mas obrigado também

cafezin
marcio_gs:
Os livros podem ser repetidos? Se sim, use:
void lerLivro(List<Livro> livros) {  
}

Se não, use:

void lerLivro(Set<Livro> livros) {  
}

Ambas são coleções da Collections framework do Java. A primeira é a interface que representa a estrutura de dados lista, a segunda representa a estrutura de dados conjunto. Uma pesquisa no google lhe explicará outros detalhes =)

No caso pra popular teria de ser na raça mesmo né... Porque não da pra montar esses B´s com loop(estou afirmando). =p

void popula() {
		B b1 = new B("b1", true);
		B b2 = new B("b2", true);
		B b3 = new B("b3", true);
	
		massaDeDados.add(b1);
		massaDeDados.add(b2);
		massaDeDados.add(b3);
		
	}
Criado 7 de fevereiro de 2011
Ultima resposta 7 de fev. de 2011
Respostas 7
Participantes 4