Membro desde: 25/07/2006 22:39:04
Mensagens: 131
Offline
Estou com um problema com o clone que é o seguinte
Tenho um ArrayList<Pergunta>
Preciso alterar a resposta de uma pergunta em um determinada posicao do array e que nao seja alterado outra.Porem esta alterando. Veja o codigo de exemplo que fiz
public class Pergunta implements Cloneable {
private String pergunta;
private String resposta;
public void setPergunta(String pergunta) {
this.pergunta = pergunta;
}
public String getResposta() {
return resposta;
}
public void setResposta(String resposta) {
this.resposta = resposta;
}
}
public class TesteArrayClone {
public static void main(String[] args) {
new TesteArrayClone();
}
TesteArrayClone() {
ArrayList<Pergunta> perguntas = new ArrayList<Pergunta>();
perguntas.add(new Pergunta("PerguntaA"));
perguntas.add(new Pergunta("PerguntaB"));
ArrayList<Pergunta> clone = (ArrayList<Pergunta> perguntas.clone();
((Pergunta) clone.get(0)).setResposta("Resposta de A");
System.out.println(perguntas.get(0).getResposta()) // Saida = Resposta de A -Aqui nao deveria ter alterado.
System.out.println(clone.get(0).getResposta()) //Saida = Resposta de A
}
}
Não se se fiz o clone corretamente...Porem gostaria que me ajudassem
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
jr.mg wrote:Estou com um problema com o clone que é o seguinte
Tenho um ArrayList<Pergunta>
Preciso alterar a resposta de uma pergunta em um determinada posicao do array e que nao seja alterado outra.Porem esta alterando.
ArrayList ou qualquer outro collection não implementa clone. Ele simplesmente usa o clone de Object.
O clone de Objet é um shalow-clone , ou seja, ele cria uma outra instancia do objeto e seta todos os campos com a mesma referencia
do original. i.e. ele não clona os campos.
No caso particular das listas ele não clona os menbros da lista.
Para ter duas listas , com os mesmos objetos lá dentro mas em que precisa manipular uma em separado da outra crie um cópia (não um clone) uma copia é simples com collections, basta instanciar outro objeto e passar o primeiro como argumento.
Agora, se quer clonar os objetos dentro da lista, então tem que implementar clone à mão. Isso significa criar a sua propria lista que faça isso.
Membro desde: 21/07/2007 17:44:31
Mensagens: 2485
Localização: Paraná
Offline
Você pode fazer um método clone retornar um objeto do tipo da classe
Isso é muito feio
Eu não consigo usar Cloneable
This message was edited 1 time. Last update was at 11/09/2008 18:16:35
Como organizar o GUJ. Meu Twitter. Meu blog. Future proofing means making code easy to change, not trying to anticipate every possible way your code might need to change.