Padrão memento

10 respostas
ECO2004

Olá!

Feliz Natal, antes de tudo!

No padrão Memento, eu armazeno o estado de um objeto para depois recuperar (undo). Quando eu copio uma instância de um objeto, eu já estou copiando o seu estado, não é (o valor de todas as suas variáveis)?

Assim, se eu tenho um classe A com variáveis setadas e eu faço:

ClassA a1 = new ClassA();
a1.setVar1(1);
a1.setVar2(2);
.
.
.

e depois faço

ClassA a2 = a1;

estou salvando o estado do objeto a1 em a2?

10 Respostas

B

Nesse caso, você não tem dois objetos distintos na memória. Só existe um objeto, e as variáveis a1 e a2 apontam para ele…

Se você fizer:

a1.setVar1(NOVO_VALOR);

Quando fizer:

a2.getVar1();

Você obterá como retorno o “NOVO_VALOR”, ou seja, o “estado antigo” não está sendo salvo, porque ambas as variáveis trabalham em cima do mesmo objeto.

ECO2004

bob_sponja:
Nesse caso, você não tem dois objetos distintos na memória. Só existe um objeto, e as variáveis a1 e a2 apontam para ele…

Se você fizer:

a1.setVar1(NOVO_VALOR);

Quando fizer:

a2.getVar1();

Você obterá como retorno o “NOVO_VALOR”, ou seja, o “estado antigo” não está sendo salvo, porque ambas as variáveis trabalham em cima do mesmo objeto.

Então, eu tenho mesmo que usar new, né?

Eu estava usando Singleton. Quando eu queria salvar o estado do objeto, eu retornava a instância singleton e salvava em um ArrayList.

Mas pelo que você disse (e concordo, além de ter testado) é que ambos objetos apontam para a mesma instância.

Usar Singleton com Memento não dá certo?

B

Cara, eu não conheço bem o memento para poder falar, mas acho que com Singleton não dá, porque você deve guardar o estado de um objeto, e o modo mais comum de se fazer isso é utilizando o método clone. Ou seja, você teria mais de uma instância da mesma classe…

Eu faria assim pra guardar o estado:

ClasseA backup = a1.clone();

Dessa forma, a variável backup apontaria para uma nova instância da ClasseA, e as modificações feitas utilizando a variável a1 não afetariam o estado da variável backup

ECO2004

bob_sponja:
Cara, eu não conheço bem o memento para poder falar, mas acho que com Singleton não dá, porque você deve guardar o estado de um objeto, e o modo mais comum de se fazer isso é utilizando o método clone. Ou seja, você teria mais de uma instância da mesma classe…

Eu faria assim pra guardar o estado:

ClasseA backup = a1.clone();

Dessa forma, a variável backup apontaria para uma nova instância da ClasseA, e as modificações feitas utilizando a variável a1 não afetariam o estado da variável backup

Você leu os meus pensamentos!ha ha
Pensei “uai, mas já tem o prototype…”
Padrão meio estranho…para funcionar, usa inteiramente outro!

B

Pois é, existem padrões muito parecidos, o que muda na verdade é a intenção deles e talz, tipo State / Strategy… dependendo do ponto de vista que se olhe, eles não tem muita diferença… Mas como eu falei, não conheço direito o memento para poder falar…

Se alguém mais experiente puder dar o ar da graça, agradeceríamos =)… E feliz natal pra você tmb…

B

Achei esse artigo aqui que pode dar uma luz… Tirando a péssima identação do código, o conteúdo é maneiro: http://imasters.com.br/artigo/16994/java/padrao_de_projetos_com_memento/

ViniGodoy

Eu não costumo a citar a concorrência do meu portal, mas nesse caso vale a pena:
http://abrindoojogo.com.br/padroes-de-projeto-memento

ECO2004

bob_sponja:
Cara, eu não conheço bem o memento para poder falar, mas acho que com Singleton não dá, porque você deve guardar o estado de um objeto, e o modo mais comum de se fazer isso é utilizando o método clone. Ou seja, você teria mais de uma instância da mesma classe…

Eu faria assim pra guardar o estado:

ClasseA backup = a1.clone();

Dessa forma, a variável backup apontaria para uma nova instância da ClasseA, e as modificações feitas utilizando a variável a1 não afetariam o estado da variável backup

Olha que engraçado…quando eu faço:

A1 obj = (A1)a1.clone()

está sendo lançada uma CloneNotSupportedException.

Alguém sabe o que poderia estar impedindo a clonagem da classe?

ViniGodoy

Você fez sua classe implementar a interface Cloneable?

ECO2004

@Vini

Sim…

Faz-me o favor…olha o post http://www.guj.com.br/java/261571-padrao-memento–padrao-prototype. Não obtive resposta ainda e juro que não sei o que está acontecendo!

Criado 24 de dezembro de 2011
Ultima resposta 27 de dez. de 2011
Respostas 10
Participantes 3