[RESOLVIDO] Como instância quantidade variável de Objetos?

21 respostas
rebinho

E aí galera beleza?

Pessoal preciso criar um método em que o usuário entre com um valor entre 1 e 5.
E a partir desse valor será instânciada a quantidade de objetos conforme o nº digitado.
Por exemplo se digitou 2… Exemplo ex1 = new Exemplo(); Exemplo ex2 = new Exemplo();
Tentei fazer usando Switch Case…Tipo: case 1: Exemplo ex1 = new Exemplo(); break; case 2: Exemplo ex1 = new Exemplo(); Exemplo ex2 = new Exemplo(); break;
Mais a IDE (Netbeans) já acusa a primeira linha do case 2 como erro, porque está sendo instanciado um objeto repetido…
Para resolver pensei em fazer com array… Tipo o usuário digita quantas objetos instanciar ai será o tamanho da array.
Depois faço um FOR e vou instanciando um objeto para cada linha do array através de um índice. Algo como:

Exemplo[] exemploArray = new Exemplo[tamanho]; for(int i = 0; i < tamanho; i++){ exemploArray[i] = new Exemplo(); }
Se tratando de programar de forma correta (lembrando que tenho pouquíssimo conhecimento), isto estaria dentro dos padrões de OO? Alguém pode me sugerir uma forma melhor de ser feito… Pois no programa os objetos não necessariamente seriam instanciados todos no mesmo momento. Com isso se usar array já me dará uma certo trabalho posteriormente para aumentar a quantidade etc…

Valeu Abraço!

21 Respostas

gpeixoto

Então eu sou extremamente noob em Java mas passou um trem na minha cabeça lendo a sua dúvida.

Não dá pra criar um método que instancia a classe alvo e esse método ser chamado as N vezes necessárias por um for ?

F

Na minha opinião isso ai não faz sentido algum, tipo: instanciar a classe várias vezes com um construtor sem argumentos. Classe cl = new Classe();

Seria mais interessante se você criasse um construtor com argumentos. Exemplo:

public class Classe{


//Atributos
private String nome;
private String sobrenome;


//Método construtor.
public classe (String nome, String sobrenome){ 

setNome(nome);
setSobrenome(sobrenome);

}

//Métodos gets e sets ....

}


//-------------* Instanciando a classe *-----------------------------

//Aqui você poderia criar um laço onde lia o nome e o sobrenome do teclado jogando em duas variáveis e depois esses valores seriam armazenados dentro de um array. 
//Você criar duas variáveis nome e sobrenome depois é só instanciar a classe pegar esse objeto e add no array.

Classe cl = new Classe(nome,sobrenome);
array.add(cl);
ViniGodoy

Use vetores.

Scanner scanner = new Scanner(System.in); System.out.println("Número de objetos?"); int numero = scanner.nextInt(); Exemplo ex[] = new Exemplo[numero]; for (int i = 0; i < ex.length; i++) ex[i] = new Exemplo();

rebinho

Galera desculpe a demora em responder!
Não teve como eu acessar o fórum antes…

rebinho

gpeixoto:
Então eu sou extremamente noob em Java mas passou um trem na minha cabeça lendo a sua dúvida.

Não dá pra criar um método que instancia a classe alvo e esse método ser chamado as N vezes necessárias por um for ?

Olá gpeixoto tudo certo parceiro?

Então cara era mais ou menos isso que eu estava pensando… (Mais também sou extremamente em noob em Java) :cry:
Eu iria criar um vetor e usar o FOR para chamar o método N vezes. Porém digamos que o usuário pedisse da primeira vez para criar apenas 1 objeto, ai o vetor teria apenas uma posição, e na próxima “rodada” mais 1 e assim por diante… Ai eu teria que ficar redefinindo o tamanho do vetor e ver uma forma de não perder os dados que já estavam no vetor criado…

No caso o usuário poderá instanciar entre 1 e 5 objetos… Pensei em criar um vetor da classe X, e quando ele mandasse instanciar um nosso objeto eu poderia verificar se a posição do vetor é = null se for verifica a próxima até achar uma posição livre… Talvez funcione rsrs

Valeu pela dica, abraço!

rebinho
felipevs:
Na minha opinião isso ai não faz sentido algum, tipo: instanciar a classe várias vezes com um construtor sem argumentos. Classe cl = new Classe();

Seria mais interessante se você criasse um construtor com argumentos. Exemplo:

public class Classe{


//Atributos
private String nome;
private String sobrenome;


//Método construtor.
public classe (String nome, String sobrenome){ 

setNome(nome);
setSobrenome(sobrenome);

}

//Métodos gets e sets ....

}


//-------------* Instanciando a classe *-----------------------------

//Aqui você poderia criar um laço onde lia o nome e o sobrenome do teclado jogando em duas variáveis e depois esses valores seriam armazenados dentro de um array. 
//Você criar duas variáveis nome e sobrenome depois é só instanciar a classe pegar esse objeto e add no array.

Classe cl = new Classe(nome,sobrenome);
array.add(cl);

Iae felipevs tudo bem?

Então no caso da classe, atributos e métodos que ela vai ter já praticamente tudo certo...

Meu problema seria em instanciar uma quantidade X (1 a 5) de objetos dessa classe. Porque pode ser instanciado até 5 objetos, porem cada um em um momento diferente da execução, ou 3 de uma vez depois mais 2 etc...

Mais me chamou muito atenção onde você colocou:
array.add(cl);
Com isso teria como eu por exemplo "colocar" mais um índice em um vetor? Por exemplo tenho um vetor de duas posições do tipo X... Teria como quando for executado gerar um terceiro índice pro vetor... Se for possível será uma maravilha pois assim não preciso declarar um vetor de 5 posições onde nem todas serão usadas.

Obrigado pela ajuda, Abraço!

rebinho

ViniGodoy:
Use vetores.

Scanner scanner = new Scanner(System.in); System.out.println("Número de objetos?"); int numero = scanner.nextInt(); Exemplo ex[] = new Exemplo[numero]; for (int i = 0; i < ex.length; i++) ex[i] = new Exemplo();

Então cara cheguei a conclusão que vetores será a melhor opção mesmo (pelo menos dentro do que conheço).

Minha dúvida é quanto a quantidade de posições do vetor (como já disse de uma a cinco).
Será que teria como ir incrementando posições no vetor de acordo com a quantidade de objetos que o usuário pede pra instanciar?
Porque se simplesmente criar um novo vetor vai ficar uma zona, e se redefinir o tamanho mesmo terei que pensar como não perder o que já tinha guardado no mesmo… Há lembrando que não irei usar BD nem nada do tipo para armazenar. Seria só no momento da execução mesmo. A classe principal fica em um loop infinito até o usuário optar por encerrar o programa!

Valeu abraço!

lucas_vieira

Uma vez precisei fazer algo parecido… e a melhor solução foi a que vc pensou por ultimo e o Vini deu uma otimizada.
utilize vetores, e se não houvesse um limite na quantidade de objetos um List (ou ArrayList) tbm seria uma boa opção.

Abraço

ViniGodoy

Se você preicsa de tamanho variável, use o ArrayList:

Scanner scanner = new Scanner(System.in); List<Exemplo> exemplos = new ArrayList<Exemplo>() String resposta; do { Exemplo ex = new Exemplo(); exemplos.add(ex); System.out.println("Um exemplo foi criado, deseja criar mais um?"); resposta = scanner.nextLine(); } while (resposta.equalsIgnoreCase("S") || resposta.equalsIgnoreCase("sim")); System.out.printf("%d exemplos criados!%n", exemplos.size());

rebinho

lucas_vieira:
Uma vez precisei fazer algo parecido… e a melhor solução foi a que vc pensou por ultimo e o Vini deu uma otimizada.
utilize vetores, e se não houvesse um limite na quantidade de objetos um List (ou ArrayList) tbm seria uma boa opção.

Abraço


Olá lucas_vieira.

Então parceiro limite tem que é cinco (5) porém a quantidade é variável… Pode ser instanciado 1, 2, 3, 4 ou 5 objetos.
Ai se usasse vetor de uma classe X com 5 posições e fosse instanciado somente 2 objetos por exemplo as outras três (3) posições ficariam nulas. Mas como o programa não visa tanto a performance e o desempenho até seria viável fazer de forma…

Obrigado pela ajuda, abraço!

rebinho

ViniGodoy:
Se você preicsa de tamanho variável, use o ArrayList:

Scanner scanner = new Scanner(System.in); List<Exemplo> exemplos = new ArrayList<Exemplo>() String resposta; do { Exemplo ex = new Exemplo(); exemplos.add(ex); System.out.println("Um exemplo foi criado, deseja criar mais um?"); resposta = scanner.nextLine(); } while (resposta.equalsIgnoreCase("S") || resposta.equalsIgnoreCase("sim")); System.out.printf("%d exemplos criados!%n", exemplos.size());

ViniGodoy muito obrigado cara… Com seu exemplo já tive uma base como criar o método, ainda não aprendi a mexer com ArrayList mais dei uma fuçada e deu pra entender mais ou menos como funciona. :slight_smile:
Agora vou dar uma estudada pra entender melhor, ai vai ficar show de bola o programinha…rs

Obrigado pelas dicas, abraço!

rebinho

[size=18]TÓPICO RESOLVIDO![/size]

Obrigado ai galera que deu uma força…
Abraço!

ViniGodoy

rebinho:
ViniGodoy muito obrigado cara… Com seu exemplo já tive uma base como criar o método, ainda não aprendi a mexer com ArrayList mais dei uma fuçada e deu pra entender mais ou menos como funciona. :slight_smile:
Agora vou dar uma estudada pra entender melhor, ai vai ficar show de bola o programinha…rs

Obrigado pelas dicas, abraço!

Dê uma olhada nesses exemplos também:

lucas_vieira

Que isso cara estamos aqui pra ajudar (e ser ajudados na maioria das vezes… aushuas).
De uma olhada nesse link que o Vini postou… uma hora ou outra vc vai precisar usar um ArrayList
e conhecer seu comportamento e como utiliza-lo pode te poupar tempo e esforço adicional.

Continue estudando, nunca vai ser demais :smiley:

Abraço

rebinho

[quote=ViniGodoy]

rebinho:
ViniGodoy muito obrigado cara… Com seu exemplo já tive uma base como criar o método, ainda não aprendi a mexer com ArrayList mais dei uma fuçada e deu pra entender mais ou menos como funciona. :slight_smile:
Agora vou dar uma estudada pra entender melhor, ai vai ficar show de bola o programinha…rs

Obrigado pelas dicas, abraço!

Dê uma olhada nesses exemplos também:


Opa valeu cara muito bom os exemplos… Salvei aqui pra dar uma olhada melhor e brincar um pouquinho depois! :wink:

Desculpa perguntar mais quanto tempo tem de experiência em Java?rs Sempre que tenho dúvida e procuro algum tópico tem dicas suas!hehe :lol:

Falo abraço!

rebinho

lucas_vieira:
Que isso cara estamos aqui pra ajudar (e ser ajudados na maioria das vezes… aushuas).
De uma olhada nesse link que o Vini postou… uma hora ou outra vc vai precisar usar um ArrayList
e conhecer seu comportamento e como utiliza-lo pode te poupar tempo e esforço adicional.

Continue estudando, nunca vai ser demais :smiley:

Abraço


Com certeza vou dar uma olhada sim brother. Vai ser de grande serventia…
E estudar tem muita estrada pela frente ainda rsrs Comecei esse ano mais num vejo a hora de ficar bom nesse diabo! :?

Abraço!

rebinho

A não querendo abusar mais só uma coisinha galera...rs

Digamos que eu tenha a classe MAIN e outra classe PESSOA:
public class Pessoa {
    String nome;
    int idade;
    double salario;
...
E fizesse o seguinte:
List<Pessoa> listaPessoas = new ArrayList<Pessoa>();
    Pessoa pessoa = new Pessoa();  //Preciso instanciar esse objeto aqui? Ou deve ser dentro do método?

    void valoresPessoa(){
            nome = JOptionPane.showInputDialog("Digite o nome:"); //Posso colocar  'nome = JOp...' para atribuir um valor?
            ..........

            listaPessoas.add(this);  //se colocar pra add THIS ou o objeto pessoa da no mesmo? 
            //ou uso THIS  quando o método é invocado pelo próprio objeto?
    }
Desculpe se estiver falando besteira! :roll:

Abraço!

ViniGodoy

Eu tenho 8 anos de experiência em Java. O que é muito se considerar que antes disso eu já tinha outros 7 de experiência em programação.

ViniGodoy

Se o método valoresPessoa estiver dentro da classe pessoa, ele pode ser só assim:

void valoresPessoa(){  
        nome = JOptionPane.showInputDialog("Digite o nome:"); //Posso colocar  'nome = JOp...' para atribuir um valor?  
        ..........  
  
        listaPessoas.add(this);  //se colocar pra add THIS ou o objeto pessoa da no mesmo?       
}

Como "nome" é um atributo da sua classe, vc pode sim fazer nome = JOptionPane...

Só cuidado que o OptionPane retorna null caso o usuário pressione cancel.

Agora, o ideal mesmo é separar a leitura dos dados da classe de negócio.

rebinho
ViniGodoy:
Eu tenho 8 anos de experiência em Java. O que é muito se considerar que antes disso eu já tinha outros 7 de experiência em programação.
Eitaa :shock: nasceu codificando Assembly. :) Assim não tem graça brincar!rs :?
ViniGodoy:
Se o método valoresPessoa estiver dentro da classe pessoa, ele pode ser só assim:
void valoresPessoa(){    
        nome = JOptionPane.showInputDialog("Digite o nome:"); //Posso colocar  'nome = JOp...' para atribuir um valor?    
        ..........    
    
        listaPessoas.add(this);  //se colocar pra add THIS ou o objeto pessoa da no mesmo?         
}
O this também pode ser usado nesse caso néh?
ViniGodoy:
Só cuidado que o OptionPane retorna null caso o usuário pressione cancel.

Agora, o ideal mesmo é separar a leitura dos dados da classe de negócio.

Crio uma classe somente pra leitura dos dados? Ou coloco na MAIN mesmo?

ViniGodoy

Ali, se vc fizer o new pessoa, estará colocando um outro objeto pessoa, que vc criou com o new.
Se vc usar o this, estará colocando o objeto pessoa em questão, cujo código do método está sendo executado.

“this” significa “eu mesmo”.

PS: Quando comecei as linguagens da moda eram o Clipper (que já estava saindo) e o eterno C++. Estavam se popularizando o Delphi, o VB e o Clipper. E o Java não existia.

Criado 14 de maio de 2011
Ultima resposta 17 de mai. de 2011
Respostas 21
Participantes 5