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:
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
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:
ClasseAbackup=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:
ClasseAbackup=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
bob_sponja
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…
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:
ClasseAbackup=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:
A1obj=(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?