Instanciar Dinamicamente

13 respostas
C

Boa tarde, pessoal estou com um problema martelando na minha cabeça e vou passar para frente.

Quero saber se é possivel instanciar objetos em tempo de execução.
O normal para criar 3 objetos é:

Classe c1 = new Classe();

Classe c2 = new Classe();

Classe c3 = new Classe();

Agora o problema é que só vou saber o número de objetos após a execução. Tipo:

for(x=0; x<= n; x++) {

Classe c[x] = new Classe();

}

Bem essa é a idéia sei que parece loucura, mas é por aí.

Agradeço muito. Até mais. :grin: :lol: :cool:

13 Respostas

C

Se vc sabe o tipo da classe, pode usar a sua idéia mesmo:

int x = ....; // aqui vc pega a qtd de objetos q vc quer
MinhaClasse&#91;&#93; m = new MinhaClasse&#91;x&#93;;

// Percorre o vetor e cria os objetos&#58;
for &#40;int i = 0; i &lt; x; i++&#41;
    m = new MinhaClasse&#40;&#41;;

[]'s
carisio

D

Se você nunca sabe o número de objetos, tb dá pra fazer :)

____

import java.util.ArrayList;

// Corpo da classe com o escopo necessário p/ guardar todas as instancias

ArrayList minhasClasses = new ArrayList&#40;&#41;;

// Depois...em algum ponto qdo vc sabe que terá que adicionar + alguma

MinhaClasse mc = new MinhaClasse&#40;&#41;;

minhasClasses.add&#40;mc&#41;;



// Depois p/ acessar as instâncias que vc guardou é  pegar do ArrayList

minhasClasses.get&#40;3&#41;; // Pega a quarta instância que vc guardou.

Acho que é isso.. =)

R

Eu trabalho dessa forma:

Crio um objeto auxiliar - Aux

public Curso Cur;
public Curso Aux;

public Curso Proximo;

Faço uma consulta que retorna varios cursos por exemplo, dentro do While eu vou instanciando um objeto para cada curso

Aux.Proximo = new Curso();
Aux = Aux.Proximo;

Relaciono cada objeto Aux com o ponteiro do anterior, para não peder a referencia.

Depois é só fazer um for para ler os objetos

for (Aux = Cur.Proximo; Aux  != null; Aux = Aux.Proximo)  {
}
C

Carisio, testando sua idéia surgiu a dúvida não é preciso identificar a posição no vetor MinhaClasse. Tipo assim:

public class Cadastro {

Cadastro(int matricula,String nome, double nota){
    int x = 5; // aqui vc pega a qtd de objetos q vc quer 
    Aluno[] m = new Aluno[x];
//         Percorre o vetor e cria os objetos:

for (int i = 0; i < x; i++)

m[i] = new Aluno();

m[i].setMatricula(matricula);

m[i].setNome(nome);

m[i].setNota(nota);

}

}

Pois é pensei assim, mas houve um erro: i não pode ser resolvido. Isso ocorreu apenas nos sets, no new passou beleza.
Alguma idéia de como resolver. Enquanto isso vou testar as outras idéias.

Grato pela atenção de todos. :lol: :cool:

C

Boa tarde, agradeço a todos que deram suas opiniões e ajudaram de alguma forma na solução do meu problema.

Carisio, ainda fica a minha dúvida quanto a sua solução.

duinewbah, consegui tirar muito proveito da sua sugestão, grato. Vou postar a classe final para vcs darem uma olhada.

:wink:

package teste;

import java.util.Vector;

public class Cadastro2 {

private Vector listaAlunos = new Vector();

public Cadastro2() {}

public void setAluno(String nome, double nota){
    Aluno aluno = new Aluno();
    aluno.setMatricula(listaAlunos.size() + 1);
    aluno.setNome(nome);
    aluno.setNota(nota);
    listaAlunos.add(aluno);
}

public Aluno getAluno(String nome) {
    Aluno b = null;
    for (int i = 0; i &lt; listaAlunos.size(); i++) {
        Aluno a = (Aluno) listaAlunos.get(i);
        if (nome == a.getNome()) {
            b = a;
        }
    }
    if (b == null) {
        System.out.println("Aluno, " + nome + ", nao cadastrado!");
    }
    return b;
}

public void listaDadosAluno(Aluno a){
    if(a != null){
    System.out.println("Matricula: " + a.getMatricula());
    System.out.println("Nome: " + a.getNome());
    System.out.println("Nota: " + a.getNota());
    }else {
        System.out.println("Aluno não cadastrado!");
    }
}

public static void main(String[] args){
    Cadastro2 c = new Cadastro2();
    c.setAluno("Miguel",5.5);
    c.setAluno("Francisco",10.0);
    c.listaDadosAluno(c.getAluno("Francisco"));
    c.listaDadosAluno(c.getAluno("Miguel"));
}

}

===========+++++++++±=-------------------------

Agradeço a todas as contribuições. :cool: :grin: :wink:

V

Cara, olhei um pouco o teu código e ví que vc deve armazenar os alunos em um java.util.Map, seu código ficaria mais otimizado e limpo:

package teste; 

import java.util.HashMap;
import java.util.ArrayList; 

public class Cadastro2 &#123; 

private HashMap listaAlunos = new HashMap&#40;&#41;;
private int nuMatricula = 0;

public Cadastro2&#40;&#41; &#123;&#125; 

public void setAluno&#40;String nome, double nota&#41;&#123; 
  Aluno aluno = new Aluno&#40;&#41;; 
  aluno.setMatricula&#40;++nuMatricula&#41;; 
  aluno.setNome&#40;nome&#41;; 
  aluno.setNota&#40;nota&#41;; 
  // coloca aluno na lista de alunos
  // possibilita que existam alunos com nomes idênticos
  if &#40;listaAlunos.get&#40;nome&#41; != null&#41; &#123;
    ArrayList al = &#40;ArrayList&#41; listaAlunos.get&#40;nome&#41;;
    al.add&#40;aluno&#41;;
    listaAlunos.put&#40;nome,al&#41;;
  &#125; else &#123;
    ArrayList al = new ArrayList&#40;&#41;;
    al.add&#40;aluno&#41;;
    listaAlunos.put&#40;nome, al&#41;;
  &#125;
&#125; 

// retorna o&#40;s&#41; aluno&#40;s&#41; com determinado nome, ou null caso não existir
public ArrayList getAluno&#40;String nome&#41; &#123; 
  return &#40;ArrayList&#41; listaAlunos.get&#40;nome&#41;;
&#125; 

public void listaDadosAluno&#40;Aluno a&#41;&#123; 
  if&#40;a == null&#41;
    throw new NullPointerException&#40;"null"&#41;;
  System.out.println&#40;"Matricula&#58; " + a.getMatricula&#40;&#41;&#41;; 
  System.out.println&#40;"Nome&#58; " + a.getNome&#40;&#41;&#41;; 
  System.out.println&#40;"Nota&#58; " + a.getNota&#40;&#41;&#41;; 
&#125; 

public static void main&#40;String&#91;&#93; args&#41;&#123; 
  Cadastro2 c = new Cadastro2&#40;&#41;; 
  c.setAluno&#40;"Miguel",5.5&#41;; 
  c.setAluno&#40;"Francisco",10.0&#41;; 
  c.listaDadosAluno&#40;&#40;Aluno&#41; c.getAluno&#40;"Francisco"&#41;.get&#40;0&#41; &#41;; 
  c.listaDadosAluno&#40;&#40;Aluno&#41; c.getAluno&#40;"Miguel"&#41;.get&#40;0&#41; &#41;; 

&#125; 
&#125;

Acho q isso vai melhorar um pouco… (é mais complicado, mas eh melhor!!)

C

Henrique, quero entender sua colocação. Você pode conceituar e diferenciar HashMap e Vector para mim? Pq usar um e não o outro?

Grato :cool:

M

o hashmap é só uma tabela de hash, q calcula onde vai salvar o elemento atravez de seu numero de hash…, ou seja, é uma estrutra nao ordenada e não classificada… ja o vector é uma lista, nao classificado, mas ordenado, pq ele coloca elementos um atraz do outro… e nao calcula nenhum hash pro elemento…

C

Matheus, entendi sua explicação. Mas, não entendi pq o Henrique quis substituir o meu Vector por um HashMap.

Gostaria de acrescentar que está classe é só um teste para uso de vetores, na classe que usarei mesmo, o vetor abrigará objetos threads. Caso alguém tenha alguma observação agradeço. :cool:

H

Uma vantagem de trocar Vector por HashMap, que acredito ser o que Henrique quis, é que no Vector os objetos são acessados pelo índice, que é obrigatoriamente um inteiro que geralmente não tem relação com o objeto armazenado; no HashMap, você usa um outro objeto como indicador de posição. No exemplo dado, você acessa as informações do aluno pelo nome. A melhor escolha depende do que pretende fazer com a coleção: acessar as informações usando HashMap é mais fácil e intuitivo, mas se precisar iterar por todos os elementos com muita freqüência, um ArrayList, em vez de Vector, é mais apropriado.
Aí é com você. É interessante ser capaz de pegar uma Thread específica dentro da coleção, ou é melhor ser capaz de varrê-la usando fors?

V

É isso o q o Humberto falou!

Se as suas estruturas de dados forem acessadas de forma concorrente, use estruturas preparadas de modo synchronized, ao invés de HashMap use HashTable, e ao invés de ArrayList use Vector mesmo; mas procure trabalhar sempre com interfaces List, Map, Set etc…

Se quiser ter uma visão maior sobre Collections dê uma olhada na Edição 18 da JavaMagazine, tem um ótimo artigo sobre o assunto, muito bom mesmo!!

M

E não esquecer que Hashset não é sincronizado e Vector é.

Mas eu iria de LinkedList <element>

addLast()
removeFirst()

Só isso já quebra um galho…

C

Vou usar o Vector mesmo, muito obrigado pessoal!

Até +,
Francisco

Criado 7 de outubro de 2004
Ultima resposta 10 de nov. de 2004
Respostas 13
Participantes 8