Opinião sobre clonar objetos (usando serializable)

6 respostas
F

Boa noite pessoal,
Estou precisando trabalhar com clone de um objeto que possue uma profundidade até mais ou menos. Para não ter que implementar a interface clonable e sobrepor o método clone em todos os objetos associados no grafo, eu criei o seguinte método:

public static Object clonar(Serializable object){
	try{
		
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);
		oos.writeObject(object);
		oos.flush();
		oos.close();
		
		ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
		ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
		Object retorno = objectInputStream.readObject();
		objectInputStream.close();
		
		byteArrayOutputStream.flush();
		byteArrayOutputStream.close();
		byteArrayInputStream.close();
		
		return retorno;
		
	}catch(Exception exe){
	      return exe.getMessage();
	}
  }

Dessa forma eu só faço os objetos associados implementarem a interface Serializable. Aparentemente está funcionando normal, ja depurei com o eclipse e consegui verificar que mesmo as coleções associadas com aquele primeiro objeto não estão utilizando a mesma referência de memória que o objeto retornado (o clone). Gostaria de saber se existe alguma restrição ou algum alerta que devo tomar cuidado ao utilizar o método ácima, ou, vocês acham que está tudo ok?
Como eu fiz esse método agora e ainda não o utilizei, eu pensei em postar aqui no guj porque derrepente tem algum “efeito colateral” desse método que eu não consegui enxergar.

Desde já obrigado a todos e qualquer opinião é muito bem vinda!

6 Respostas

Aldrin_Leal

Seu método retornar uma String (como irá ocorrer em caso de erro) é coisa feia.

Apenas organize melhor em um bloco try/catch/finally, e lance a exception pega encapsulada em uma exception (RuntimeException, talvez).

F

legal, valeu pela dica, vou melhorar sim !

F

Pessoal, uma melhorada no método:

public static Object clonar(Serializable object)throws IOException, ClassNotFoundException{
	
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);
		oos.writeObject(object);
		oos.flush();
		oos.close();
		
		ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
		ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
		Object retorno = objectInputStream.readObject();
		objectInputStream.close();
		
		byteArrayOutputStream.flush();
		byteArrayOutputStream.close();
		byteArrayInputStream.close();
		
		return retorno;

}

Qualquer opinião é bem vinda!

sergiotaborda

FernandoLima:
Boa noite pessoal,
Estou precisando trabalhar com clone de um objeto que possue uma profundidade até mais ou menos. Para não ter que implementar a interface clonable e sobrepor o método clone.

Fora ao fato de serializar está dependente da profundidade e da memoria disponivel, que é lento e não é o mesmo que clonagem, o resto tá certo. Vc não quer sobre escrever clone() e implementar Cloneable mas implementa static clonar(Serializable) e faz todos os objetos serem Serializable.

quanto a mim é uma daquelas ideias que funcionam , mas não devem ser usadas.

em 3 letras : POG

D

POG das boas =P

Mas que atire a primeira pedra quem nunca fez…

Se algum desgraçad da SUN pensou na interface Cloneable, acho uma ótma vc utilizá-la… =) Devem existir uns plugins por ai que geram o codigo do cloneable…

Se nao encontrar, pesquise sobre a Commons-BeanUtils … tem umas features massa =)

[]s

F

Bom dia pessoal,
valeu pelas opiniões! Esse método está numa classse chamada util, eu não iria implementar ele nos métodos de negócio da aplicação! Mas legal, eu coloquei aqui no guj para saber da opinião de vocês mesmo. Em relação a quantidade de memória, isso eu considerei para esse método, mas como os objetos que preciso clonar são puramente POJO, acho que eu não teria um JavaHeapSpace de presente de ano novo heheheheheh
Eu vou baixar Commons-BeanUtils e dar uma olhada nela !

Obrigado a todos, e novamente, qualquer opinião é bem vinda !

Abraços

Criado 28 de dezembro de 2007
Ultima resposta 29 de dez. de 2007
Respostas 6
Participantes 4