Esta postagem foi sinalizada pela comunidade e está oculta temporariamente.
Possivelmente pq você esta sempre adicionando a mesma instancia x vezes no arraylist, o correto é sempre criar um novo objeto antes de inserir
for(int i = 0; i < 5; i++) {
Pessoa pessoa = new Pessoa();
pessoa.setId(i);
lista.add(pessoa);
}
public class TesteEstranho {
static Gen estrutura;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.println("iniciando");
ArrayList<Gen> test = new ArrayList<>();
Gen g = estrutura;
g.nome = ("TESTEEEEEEE");
test.add(0,estrutura);
test.add(1,g);
System.out.println("----------------");
for(int c=0;c<=test.size()-1;c++){
System.out.println(test.get(c).nome);
}
}
}
public class TesteEstranho {
static Gen estrutura; // essa variável não foi inicializada
public static void main(String[] args) {
System.out.println("iniciando");
ArrayList<Gen> test = new ArrayList<>();
Gen g = estrutura; // aqui você declara a variável g e inicializa com estrutura, que está null
g.nome = ("TESTEEEEEEE"); // aqui vai acontecer NullPointerException pois não dá pra acessar membros de objetos null
test.add(0,estrutura); // estrutura e g são o mesmo objeto por isso você acha que é um clone
test.add(1,g);
System.out.println("----------------");
for(int c=0;c<=test.size()-1;c++){
System.out.println(test.get(c).nome);
}
}
}
nn mike, o negócio é tipo, eu tenho um elemento (classe que eu mesmo criei) e adiciono duas vezes ele no array list, mas eu nn consigo mexer neles separadamente quando quero fazer isso pelo array list que eu criei.
Duvida?
Você está adicionado 2 vezes a mesma instância de um determinada classe e quer mexer separadamente?
Se for isso você precisa entender com funciona um instância da mesma classe, porque, o dado é do tipo referencia, ou seja, a mesma instância em posições de arrays diferentes você mexe em uma e consequentemente mexeu nas demais …
De um lida em variável por valor e variável por referencia (referencia significa que todas apontam pro mesmo endereçamento de memória)
usando o exemplo que o Mike deu ali pra cima nas respostas, eu consegui fazer um treco um pouco diferente, aparentemente deu certo separando a classe em subclasses (no caso a mais importante) e depois usar o “new” pra criar um novo objeto.
@staroski acho que o problema no caso foi dar esse NullPointerException, pq na parte que eu escrevo: g.nome(“TESTEEEEEEE”) , eu uso pra diferenciar o “g” da “estrutura”
Na parte que vc diz sobre a “estrutura” não estar inicializada, nn tem problema, tem uma outra parte no programa principal que já faz isso
E como você quer diferenciá-los se ambos são o mesmo objeto?
Quando você faz g = estrutura você está dizendo que a variável g aponta para o mesmo endereço de memória que a variável estrutura.
Então o código que você postou é diferente do código que você está executando.
Pois o código postado não inicializa a variável estrutura em lugar algum, então o seu código equivale exatamente à isso aqui: g = null
o codigo inicial é muito grande, deve ter pelo menos umas 5 ou 6 páginas de código. Então eu fiz esse programa apenas para servir pra teste, no caso o problema que estava dando no principal era o mesmo deste, então fui fazendo uns testes e consegui reproduzir o mesmo tipo de problema. Que no caso eu já resolvi (em parte), fazendo com que eu “desmembre” a classe Gen em outra subclasse e depois reunir essas subclasses pra formar novamente o Gen, aparentemente deu certo pra diferenciar o “nome”, porém não são todas as variáveis dentro da classe que se tornam “livres”, apenas o nome
*obs: a solução eu só consegui resolver no programa principal e ela ainda não está completa, quando eu resolver tudo daí eu mando.
a parte mais curiosa disso é que a variável “nome”, no programa principal, está funcionando normalmente, porém as outras variáveis que também deviam estar “livres” continuam como “clones”, tem algum jeito de resolver isso de forma mais fácil?? @staroski
Você não está clonando nada.
Você está manipulando o mesmo objeto.
Imagina esse código:
TipoDeDado a = objetoX;
TipoDeDado b = objetoX;
TipoDeDado c = a;
TipoDeDado d = b;
No código acima, as variáveis objetoX, a, b, c e d são todas o mesmo objeto.
Não são clones, são a mesma referência, o mesmo endereço de memória, o mesmo ponteiro…
Então a solução seria diferenciar a variável objetoX antes de colocá-la na variável b certo?
Seria algo do tipo:
objetoX.setValor(m).
TipoDeDado a = objetoX;
objetoX.setValor(n);
TipoDeDado b = objectoX;
TipoDeDado c = a;
TipoDeDado d = b;
só desculpa minha ignorância (e a demora de uma resposta), mas no programa principal (não esse), eu diferenciei o objetoX. Mais ou menos assim:
Gen gene = Create( . . . ); (global)
. . .
public Gen Create( . . . ){
ArrayList<Neuron> neuronios = ...; (já pronta)
ArrayList<Extension> ligações = new ArrayList();
for(int c=0;c<=neuronio.lengh()-1;c++){
Neuron elementoA = (um certo neuronio de uma lista);
Neuron elementoB = (o neuronio que será ligado a ele);
Extension ext = new Extension();
ext.SetEmissor(elementoA);
ext.SetReceptor(elementoB);
ligações.add(ext);
}
Gen gen = new Gen(neuronios, ligações);
return gen;
}
o duro é que o programa é muito grande, pra conseguir achar aonde que está o erro demora demais
@staroski
Não. Se você quer objetos diferentes, vai ter que instanciar outro objeto.
no caso como eu posso fazer isso, sendo que eu preciso que os dois objetos (que posteriormente eu irei adicionar em um arraylist) tenham as mesmas coisas (independente do que a classe tiver) mas que não sejam o mesmo objeto?
Cria um novo objeto e nele você copia as propriedades do outro.