Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

jamirooo

[Resolvido] Saber se o objecto alguma vez foi modificado.

Recommended Posts

jamirooo

Boas,

A minha dúvida é q construir um métodoue me indique se o rectângulo alguma vez foi alterado. A classe é a seguinte:

public class Rectangulo implements Cloneable {
private double width;
private double height;
/** Constructor of a rectangle with dimensions w x h
 * @param w the new width
 * @param h the new height
 */
//@ ensures getWidth()==w && getHeight()==h;
public Rectangulo(int w, int h){
	width = w;
	height = h;
}
/**
 * @return the perimeter of the rectangle
 */
public double perimeter(){
	return 2*(width+height);
}
/**
 * @return the perimeter of the rectangle
 */
//@ requires perc > 0 && perc <=100;
//@ ensures getWidth()==\old(getWidth())*perc &&
// getHeight()==\old(getEight())*perc ;
public double resize(int perc) {
	width *= perc;
	height *= perc;
	return width*2+height*2;
}
public double getWidth() {
	return width;
}
public double getHeight() {
	return height;
}

public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (!(obj instanceof Rectangulo))
		return false;
	Rectangulo other = (Rectangulo) obj;
	if (height!=other.height && width!=other.width){
		return false;
	}
	return true;
}
public String toString(){
return width+"X"+height;
}
public Rectangulo clone(){
try{
	return (Rectangulo)super.clone();

}catch(CloneNotSupportedException e){
	throw new InternalError(e.toString());
}
}
}

Eu suspeito que seja talvez uma redefinição do hashcode ou assim, mas não faço ideia de como fazer isso... Se alguém me puder dar uma ajuda, ficaria agradecido. :thumbsup:

Share this post


Link to post
Share on other sites
Knitter

De que forma é que queres conhecer as alterações? O que é que queres saber?

Já agora, esse método clone não faz um clone, está a fazer uma shallow copy, ou cópia de referências, vais ficar com duas referências a apontar para o mesmo objecto, não sei se seria isso que pretendias.

Share this post


Link to post
Share on other sites
jamirooo

Já agora peço desculpa por não ter colocado a dúvida na secção de dúvidas, mas só agora me apercebi...  :thumbsup:

Share this post


Link to post
Share on other sites
jamirooo

De que forma é que queres conhecer as alterações? O que é que queres saber?

Já agora, esse método clone não faz um clone, está a fazer uma shallow copy, ou cópia de referências, vais ficar com duas referências a apontar para o mesmo objecto, não sei se seria isso que pretendias.

O que eu quero saber é, por exemplo numa outra classe crio um objecto Rectangulo, como ainda nao o alterei, ao aplicar-lhe o metodo ele dará false porque ainda nao foi alterado. Se o alterar com o resize e depois lhe aplicar novamente o metodo, ele já dará true porque já o alterei.

Quanto ao clone, se calhar não está muito correcto. Como poderia corrigir então?

Share this post


Link to post
Share on other sites
Knitter

Nesse caso, a resposta mais simples é teres uma variável que te diga se o objecto foi modificado, e em cada método que modifique o estado interno do objecto alterares essa variável. O método de que falas apenas devolve o valor dessa variável. Talvez seja útil teres uma forma de fazer reset a essa indicação de alteração.

Outra opção, seria guardares todos os estados a cada modificação, efectivamente, fazeres um clone antes de cada modificação, e o método em questão iria verificar o estado actual com o último estado guardado, mas isso talvez fosse demasiado para uma operação tão simples. Se não quisesses usar o clone, podias implementar o método hashCode, não sei qual das duas opções seria melhor. Acho qualquer uma das duas desnecessária.

O problema do clone, é que estás a invocar o método da classe mãe da classe Rectangulo, que neste caso é a classe Object, e essa classe não tem o método clone implementado para clonar o objecto mas sim para fazer uma cópia de referências.

Uma possível implementação seria algo como:

public Rectangulo clone() {
    return new Rectangulo(width, height);
}

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

×

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.