Como Verificar Alteração no Objeto

13 respostas
colored

Bom estou precisando verificar se houve algum tipo de alteração em 1 objeto…
Por ex: Eu Tenho um Mini Cadastro e após ele salvar outros campos são liberados para conclusão, e com isso o cadastro feito anteriormente pode sofrer alterações
mas quando eu vou finalizar tudo esse orçamento eu tenho q fazer essa verificação, se houve alteração… e tá triste pq nada q eu tento da certo…

Eu pensava que por exemplo…

Pessoa p = new PessoaFisica();
p.setNome("José");

Pessoa p1 = p;

Ele só iria igualar os objetos nesse momento mas, aparentemente eles sempre estão iguais, caso eu faça alguma mudança em p, p1 também sofre a mudança…
Alguem tem alguma ideia q possa me ajudar como resolver isso???

Muito Obrigado :smiley:

13 Respostas

luciano2

Cara oque você está fazendo é apenas atribuir a referencia de um objeto a uma variavel.

Ambas as variaveis p e p1 apontam para o mesmo objeto. Para fazer oque você está querendo você tem que instanciar um novo objeto e copiar os valores.

colored

Tipo…

p1.setNome(p.getNome);

???

Mas tipo n tem algum modo de eu verificar se 1 objeto foi alterado???

luciano2

Se seu negocio depende dessa verificação, é legal que você crie um flag de atualização no objeto, e caso em algum ponto o objeto for atualizado o flag deve ser setado para true e na hora que você for reutilizar você checa o flag.

colored

Sim essa seria a ideia simples… eh que tipo eu to reorganizando um projeto… e no codigo q o cara fez… uma classe com uns 30 atributos ele guardou todos em variaveis e depois comparou uma por uma…
Isso fica Horrivel… por isso eu queria algo mais interessante, e fora q isso eh usado sempre…

o cara fez isso mesmo q vc disse nessa classe, mas convenhamos que pra esse caso fica muito ruim concorda…

eberson_oliveira

Olá,

Já pensou na possibilidade de implementar um Observer? Talvez você consiga resolver com esse padrão.

[]s
Éberson

luciano2

E se implementar o observer não se esqueça de postar a solução porque eu já tentei fazer isso em um projeto mas no final não deu tempo.

B

Ola,

Para isto tem o PropertyChangeListener, com o PropertyChangeSupport… que server pra isto… ou mesmo o Observer, como foi citado pelo colega acima.

_fs

Não tem solução elegante pra esse problema.

Você pode fazer um pouco de mágica com Reflection, inicializando uma coleção com os valores antigos e em determinado momento comparar com o estado atual do objeto.

Ou se quiser uma solução que deixa tudo transparente, mas com mágica em excesso, use AspectJ.

pmlm
Pessoa p = new PessoaFisica();  
p.setNome("José");  

Pessoa p1 = p.clone();
p.setNome("António");  

if (!p.equals(p1)){
    System.out.println("São diferentes");
}

Nota que terás de implementar a interface Cloneable na tua classe Pessoa e fazer override do método clone().

colored

Eu Tentei… Implementar o observer mais eh muito tenso…
entao tentei o clone mas parece q n funcionou muito bem…

Pessoa p = new Pessoa();
		p.setNome("Jefferson");
		
		Pessoa p1 = (Pessoa) p.clone();
//		p1.setNome("Astolfo");
		
		if(p1 == p){
			System.out.println("Eh Igual");
		}
		else{
			System.out.println("Eh Diferente");
		}
public class Pessoa implements Cloneable{

	private int id;
	private String nome;
	
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}

Alguem pode me Ajudar :X?
Ou sei lá me mostrar um exeplo 1 pk mais simples d observer pq n consegui entende-lo…

Obrigado a todos que ja deram uma força ;D

pmlm
Pessoa p = new Pessoa();
		p.setNome("Jefferson");
		
		Pessoa p1 = (Pessoa) p.clone();
		p1.setNome("Astolfo");
		
		if(p1.equals(p)){         //Equals e não ==
			System.out.println("Eh Igual");
		}
		else{
			System.out.println("Eh Diferente");
		}
public class Pessoa implements Cloneable{

	private int id;
	private String nome;
	
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
       
        public boolean equals(Object other) {
            if (other == null) {            //O outro ojecto é null
                return false;
            } 
            if (!other instnaceof Pessoa) {  //O outro objecto não é uma Pessoa
                return false;
            }
  
          Pessoa p2 = (Pessoa) other;
         
          if (this.id != p2.id || !this.nome.equals(p2.nome)){  //O outro objecto tem id ou nome diferente
                 return false;
          }  
         
           return true;

    }
}
colored

Entendi pmlm …
Mas o problema está que estou procurando uma solução justamente para não ter q ficar comparando atributo a atributo… pq tenho algumas classes com muitos…
O otro cara aki até implementou dessa forma, mas eu acho q eh muito estranho… por isso achei q houvesse algo pra verificar o objeto por completo e nao campo a campo

pmlm

Verificar o “objecto completo” não é possível uma vez que o que define o objecto são os seus atributos. Podes, como também penso que já foi sugerido, adicionar uma flag à tua classe pessoa, que alteres quando o objecto for alterado.

Criado 7 de maio de 2010
Ultima resposta 10 de mai. de 2010
Respostas 13
Participantes 6