O que eu to dizendo é que em java é copiado somente a referencia e nao o objeto. E eu já sei disso.
M
matheuslmota
Cara, você pode implementar a interface Cloneable da seguinte forma:
publicclassTesteCloneimplementsCloneable{inta;publicTesteClone(){}//Construtor normalpublicTesteClone(TesteCloneoutro){//Contrutor de clonagemthis.a=outro.a;}publicObjectclone(){returnnew(this);}}
O clone normalmente é implementado através de um contrutor de clonagem.
Tente fazer dessa forma.
G
Guilherme_Trovo
Cara, implementa Cloneable…
A forma como o matheuslmota indicou é boa, o chato é ficar clonando tudo o que precisar “na mão”.
Um jeito fácil e rápido que já fiz é no método clone() você deserializar o objeto e serializar novamente (assim além de Cloneable sua classe e todas as outras classes que ela tem atributos tem que implementar Serializable).
C
caio.ribeiro.pereira
Já passei por um problema desses uma vez, a solução é simples, se vc deseja clonar um objeto implemente a interface Cloneable e sobrescreva seu metodo assim:
publicclassModeloimplementsCloneable{//Sobreescreva o metodo clone.publicModeloclone(){return(Modelo)super.clone();}
Agora se o seu caso é clonar uma estrutura Collection completa, será necessário pesquisar bem qual estrutura já possui o método clone() implementado, por exemplo:
List<Modelo>lista=newArrayList<Modelo>();// Essa instância de ArrayList não vem com o método clone() nativo.ArrayList<Modelo>lista=newArrayList<Modelo>();// Já essa instância pura de ArrayList já vem com o método clone().
a princípio só conheço essa Collection (ArrayList pura) que possui técnicas de clonagem, as outras estruturas não sei ainda, pois nunca precisei usá-las para clonagem :lol:
C
cafezin
Guilherme Trovo:
Cara, implementa Cloneable…
A forma como o matheuslmota indicou é boa, o chato é ficar clonando tudo o que precisar “na mão”.
Um jeito fácil e rápido que já fiz é no método clone() você deserializar o objeto e serializar novamente (assim além de Cloneable sua classe e todas as outras classes que ela tem atributos tem que implementar Serializable).
É disso que eu to falando!!! Ótima dica, só nao tenho ideia de como fazer. =p
Mas voce entendeu quando eu disse um objeto complexo. Obrigado
Se puder me dar um exemplo seria perfeito.
M
matheuslmota
cafezin:
Guilherme Trovo:
Cara, implementa Cloneable…
A forma como o matheuslmota indicou é boa, o chato é ficar clonando tudo o que precisar “na mão”.
Um jeito fácil e rápido que já fiz é no método clone() você deserializar o objeto e serializar novamente (assim além de Cloneable sua classe e todas as outras classes que ela tem atributos tem que implementar Serializable).
É disso que eu to falando!!! Ótima dica, só nao tenho ideia de como fazer. =p
Mas voce entendeu quando eu disse um objeto complexo. Obrigado
Se puder me dar um exemplo seria perfeito.
Você pode implementar seu método clone da seguinte forma:
public Object clone()
{
Object object = null;
try {
FileOutputStream fileOutputStream = new FileOutputStream("object.dat");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(this);
fileOutputStream.flush();
fileOutputStream.close();
objectOutputStream.flush();
objectOutputStream.close();
FileInputStream fileInputStream = new FileInputStream("object.dat");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
object = objectInputStream.readObject();
fileInputStream.close();
objectInputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return object;
}
Faça os devidos tratamentos nas clausulas catch. O código que mandei funciona da maneira que você quer, basta que a classe a ser clonada implemente Cloneable e Serializable, se não o código não roda.
Até mais
C
cafezin
matheuslmota:
cafezin:
Guilherme Trovo:
Cara, implementa Cloneable…
A forma como o matheuslmota indicou é boa, o chato é ficar clonando tudo o que precisar “na mão”.
Um jeito fácil e rápido que já fiz é no método clone() você deserializar o objeto e serializar novamente (assim além de Cloneable sua classe e todas as outras classes que ela tem atributos tem que implementar Serializable).
É disso que eu to falando!!! Ótima dica, só nao tenho ideia de como fazer. =p
Mas voce entendeu quando eu disse um objeto complexo. Obrigado
Se puder me dar um exemplo seria perfeito.
Você pode implementar seu método clone da seguinte forma:
public Object clone()
{
Object object = null;
try {
FileOutputStream fileOutputStream = new FileOutputStream("object.dat");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(this);
fileOutputStream.flush();
fileOutputStream.close();
objectOutputStream.flush();
objectOutputStream.close();
FileInputStream fileInputStream = new FileInputStream("object.dat");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
object = objectInputStream.readObject();
fileInputStream.close();
objectInputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return object;
}
Faça os devidos tratamentos nas clausulas catch. O código que mandei funciona da maneira que você quer, basta que a classe a ser clonada implemente Cloneable e Serializable, se não o código não roda.
Até mais
Amigo, o que eu vou te falar?
Simplesmente show de bola! Funcionou como esperado
Grande Abraço e obrigado.
G
Guilherme_Trovo
o jeito que o matheuslmota postou é bom, só vejo talvez um problema de concorrência com o file object.dat…
procurando no google por “java clone serializable” ou “java deep copy” você acha vários exemplos, segue um que encontrei aqui que utiliza serialização sem utilizar file.
o jeito que o matheuslmota postou é bom, só vejo talvez um problema de concorrência com o file object.dat...
procurando no google por "java clone serializable" ou "java deep copy" você acha vários exemplos, segue um que encontrei aqui que utiliza serialização sem utilizar file.
Por enquanto vou ficar com a solução do matheuslmota que ja esta funcionando, depois vou testar esta outra. Muito obrigado
M
matheuslmota
Cara, edita seu primeiro post e acrescenta [Resolvido] ao título.
Abraço.
S
Sandro_Mueller
Oi pessoal, e quando a classe que eu quero clonar não implementa Serializable?
M
matheuslmota
Não pode. A classe deve implementar Serializable.
C
cafezin
Pois então, essa maneira que foi descrita é justamente usando serialização, tanto em memória quanto em arquivo. Existem outras soluções mais simples para clonar, são as que foram descritas nas primeiras respostas deste post.