Copia de Objecto sem usar clone?

9 respostas
X

Como é que eu posso fazer a cópia de um objecto sem usar “clone” ??
Por exemplo : Tenho as classes Ponto e Circulo

Na classe Ponto tenho as variaveis de instância (x,y) que são as coordenadas do ponto, o constructor Ponto, setX, getX, setY, getY e getPonto.

Dentro da classe circulo tenho as variaveis de instância “raio” e “centro”, em que centro é do tipo Ponto.

Como é que posso obter uma cópia de “centro” sendo que este é um objecto do tipo Ponto (acho eu??)

9 Respostas

L

E porque não utilizar o clone?

você pode criar uma variavel do tipo da sua classe e atribuir a variavel atual a ela.

X

Oi Leandro,

isto faz parte de um exercicio escolar, em que é suposto não usar “clone”.

O

xnet:
Oi Leandro,

isto faz parte de um exercicio escolar, em que é suposto não usar “clone”.

Cara nao sei se é isso que vc quer…
Vc pode usar Serializable na classe Ponto…A Serializacao quarda o estado do objeto sem mudar…

package br.com.mgf.cap6.serealizacao;

import java.io.*;

public class Ponto implements Serializable {
	
	private int x;
	private int y;
	
	public Ponto(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}
	
	

}
package br.com.mgf.cap6.serealizacao;


import java.io.*;

public class Circulo {
	public static Ponto centro;
	public static  double raio;
	
	Circulo(Ponto centro, double raio) {
		this.centro = centro;
		this.raio = raio;
	}
	
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		centro = new Ponto(10,20);
		Circulo c = new Circulo(centro, 22.10);
		FileOutputStream fo = new FileOutputStream("object.ser");
		ObjectOutputStream os = new ObjectOutputStream(fo);
		os.writeObject(centro);
		os.close();
		
		FileInputStream fi = new FileInputStream("object.ser");
		ObjectInputStream oi = new ObjectInputStream(fi);
		Ponto p = (Ponto)oi.readObject();
		oi.close();
		System.out.println(p.getX() + " " + p.getY());
		
	}

}
ViniGodoy

Você pode implementar um construtor de cópia. Essa técnica é muito usada na collections framework:

public class Ponto {
   private int x;
   private int y;

   public Ponto(int x, int y) {
        this.x = x;
        this.y = y;
   }

   //Constrói um novo ponto, idêntico ao passado por parâmetro.
   public Ponto(Ponto outroPonto) {
       this.x = outroPonto.x;
       this.y = outroPonto.y;
   }

   public int getX() {return x};
   public int getY() {return y};
}
Uso:
Ponto p = new Ponto(10,10);
Ponto p2 = new Ponto(p);
O método de cópia também poderia ser estático:
public class Ponto {
   private int x;
   private int y;

   public Ponto (int x, int y) {
        this.x = x;
        this.y = y;
   }

   //Constrói um novo ponto, idêntico ao passado por parâmetro.
   public static Ponto copy(Ponto outroPonto) {
       return new Ponto(outroPonto.x, outroPonto.y);
   }

   public int getX() {return x};
   public int getY() {return y};
}
Uso:
Ponto p = new Ponto(10,10);
Ponto p2 = Ponto.copy(p);

A vantagem de usar essa última abordagem, ao invés do Clone, é que você não é obrigado a retornar uma cópia que seja a mesma classe do ponto original. Você pode retornar uma classe filha ou um wrapper, que tenham uma implementação mais eficiente para o caso da cópia.

Ambas as abordagens tem outra vantagem. Você pode receber qualquer tipo de ponto na hora de fazer a cópia. É o que ocorre na collections framework. Você pode fazer uma cópia de um set numa lista fazendo:
List minhaLista = new ArrayList(meuSet);

Agora é saber se alguma dessas técnicas tem utilidade no seu caso.

Mantu

Pessoal, pessoal… Só uma coisa: Mexer com o método clone não é algo trivial, ok? Recomendo fortemente que o senhores leiam o item 10 do capítulo 3 do livro “Effective Java Programming Language” do Joshua Bloch antes de pensarem em mexer com o método clone, ok?
http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

ViniGodoy

Mantu:
Pessoal, pessoal… Só uma coisa: Mexer com o método clone não é algo trivial, ok? Recomendo fortemente que o senhores leiam o item 10 do capítulo 3 do livro “Effective Java Programming Language” do Joshua Bloch antes de pensarem em mexer com o método clone, ok?
http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

Exatamente, também recomendo fortemente a leitura não só desse tópico, mas do livro inteiro. Aliás, eu não só concordo em gênero, número e grau com o Mantu, como essas duas técnicas que eu citei estão no livro! :slight_smile:

Mantu

E esse acento aí? De onde veio??? :lol: :lol: :lol:

Não querendo fazer jabazão, mas esse livro é mesmo sensacional. Leitura indispensável!!!

ViniGodoy

Mantu:
Mantú
E esse acento aí? De onde veio??? :lol: :lol: :lol:

Ooooppppppssss… :oops:

Corrigido! Também não gosto quando escrevem Vinicius, Venicio, Vinícios, ou outros derivativos enganados do meu nome e entendo perfeitamente o seu comentário. :smiley:

X

Obrigado,

todas as respostas me ajudaram !

Criado 3 de abril de 2007
Ultima resposta 6 de abr. de 2007
Respostas 9
Participantes 5