Ir para o conteúdo
  • 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.

Mensagens Recomendadas

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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.