[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…
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
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:
publicclassClasse{//AtributosprivateStringnome;privateStringsobrenome;//Método construtor.publicclasse(Stringnome,Stringsobrenome){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.Classecl=newClasse(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)
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:
publicclassClasse{//AtributosprivateStringnome;privateStringsobrenome;//Método construtor.publicclasse(Stringnome,Stringsobrenome){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.Classecl=newClasse(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.
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.
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
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.
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!
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
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;
...
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.