Jump to content
Ekate

[Resolvido] Cloneable

Recommended Posts

Ekate

tenho a seguinte classe:

public class Circulo implements Cloneable {

private Ponto centro;
private int raio;
public Circulo(int raio, Ponto centro) {
 this.raio = raio;
 this.centro = centro;
}
//gets e sets
public void mover (int moveX, int moveY){
 centro.setX(centro.getX()+ moveX);
 centro.setY(centro.getY()+ moveY);
}

public void redimensionar(int factor){
 this.raio *= factor;
}

@Override
public Object clone(){
 try{
	 Circulo c = (Circulo) super.clone();
	 c.centro = (Ponto) centro.clone();
	 return c;
 } catch (CloneNotSupportedException e){
	 return null;
 }
}

@Override
public String toString() {
 return "Circulo{" + "raio = " + this.raio + ", centro = " + this.centro + '}';
}

}

e portanto quero clonar os valores da classe circulo juntamente os endereços da classe Ponto

public class Ponto implements Cloneable{

private int x;
private int y;
public Ponto(int x, int y) {
 this.x = x;
 this.y = y;
}
// gets e sets

@Override
public Object clone(){
 try {
	 return super.clone();
 } catch (CloneNotSupportedException e){
	 return null;
 }
}
@Override
public String toString() {
 return " Ponto{" + "x = " + x + ", y = " + y + '}';
}	
}

na classe main coloquei o seguinte

 Ponto centro = new Ponto(10, 10);
 Circulo c1 = new Circulo(5, centro);

 Circulo c2 = (Circulo) c1.clone();

 System.out.println("Circulo 1: " + c1);
 System.out.println("Circulo 2: " + c2);
 c1.mover(5, -5);
 c1.redimensionar(2);
 System.out.println("Circulo 1: " + c1);
 System.out.println("Circulo 2: " + c2);

mas o output que tenho é este:

"Circulo 1: Circulo{raio = 5, centro = Ponto{x = 10, y = 10}}

Circulo 2: Circulo{raio = 5, centro = Ponto{x = 10, y = 10}}

Circulo 1: Circulo{raio = 10, centro = Ponto{x = 15, y = 5}}

Circulo 2: Circulo{raio = 5, centro = Ponto{x = 10, y = 10}}"

portanto nao esta a fazer a copia quando altero os dados... nem à variavel "raio" que se encontra na classe Circulo que devia ser a mais facil de aceder..

Edited by Ekate

Share this post


Link to post
Share on other sites
Rui Carlos

mas o output que tenho é este:

"Circulo 1: Circulo{raio = 5, centro = Ponto{x = 10, y = 10}}

Circulo 2: Circulo{raio = 5, centro = Ponto{x = 10, y = 10}}

Circulo 1: Circulo{raio = 10, centro = Ponto{x = 15, y = 5}}

Circulo 2: Circulo{raio = 5, centro = Ponto{x = 10, y = 10}}"

Qual era o output que querias obter? Esse output para mim é o que faz mais sentido. Fizeste uma cópia, e depois alteraste o original. As alterações são visíveis no original, mas não na cópia.

Share this post


Link to post
Share on other sites
Ekate

pois talvez a questao seja essa... nao tenha percebido o conceito "clonar"... porque o que esperava/pensava era ao alterar os dados que, neste caso, o circulo 2 fosse tambem alterado.. portanto nao é o que é suposto acontecer? a classe cloneable o que faz é nao deixar copiar os dados?

Share this post


Link to post
Share on other sites
Ekate

Se pretendias que c1 e c2 fossem alterados em simultâneo, fazias simplesmente Circulo c2 = c1;.

pois exatamente... é que o prof colocou essa expressao e assumi que o clone tinha essa mesma funçao.. obrigada aos dois e desculpa pela burrice xD

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.