Criar Metodo clone() Generico

[quote=colored]Sim Testei. Com Reflection…

Eh q nao tinha percebido meu codigo e achei q estava usando o clone();

agora fica a duvida… pq c for colocar esse metodo em todos os pojos vai ser tenso… pq tem bastante aki no sistema…

agora com reflection ta no eskema já, já ta tratada a exception… so precisar fazer o casting mesmo…
em relação ao uso eu teria que clonar as variaveis de instacia tb… então qto 1 qto o otro daria na mesma…[/quote]

Testei aqui com o Reflection e vai clonar todos os objetos internos também.

Bom mas olha soh… marck…
eu fiz o seguinte…

PessoaFisica p = new DAOFactory().getPessoaFisicaDAO().procurarPorId(1);
			PessoaFisica p1 = (PessoaFisica) Clone.clone(p);
			
			System.out.println(p.getEndereco().getNomeEndereco());
			System.out.println(p1.getEndereco().getNomeEndereco());
			
			p1.getEndereco().setNomeEndereco("Julio Colaço");
			
			System.out.println(p1.getEndereco().getNomeEndereco());
			System.out.println(p.getEndereco().getNomeEndereco());

e me retornou…

Santa Rita de Cassia
Santa Rita de Cassia
Julio Colaço
Julio Colaço

Parece q ele tb alterou o original…

Acho q ele Clona o Objeto e so faz referencia ao objeto que eh 1 atributo desse objeto…

Pelo Quando eu pego este objeto do banco ele tem esse problema…
agora c eu crio um objeto na hora ele num da… muito estranho…

peczenyj…

Verdade boa ideia tb…

Hum… Estranho cara, aqui funcionou:

        Pessoa p = new Pessoa("Original", new Carro("Fiesta"));
        Pessoa p1 = (Pessoa) Clone.clone(p);
        p1.n = "Clone";
        p1.carro = new Carro("Ford");
        System.out.println(p.n);
        System.out.println(p.carro.nome);
        System.out.println(p1.n);
        System.out.println(p1.carro.nome);
Original
Fiesta
Clone
Ford

Utilizando aquela classe de reflection, não é?

Sim Com akela mesma kkkk.

Agora eu fiquei pensando qual o motivo para clonar um objeto que justifique usar o método clone ou algo mais elaborado.

Talvez seja o caso cogitar usar objetos imutáveis em alguns momentos. Por exemplo, um Carro, uma vez que eu criei o objeto, não deveria ser possivel alterar os seus atributos a menos que vc gere um novo carro. Dependendo do seu domínio isso pode fazer sentido E clonar este carro ou ter varias variaveis que apontam para a mesma instância não seria um problema devido a imutabilidade.

Vo utilizar isso. para comparar objetos…
pq se por exemplo eu tenho um usuario ja do banco…

usuario = usuarioAuxiliar;

blz… mas eu preciso q esse usuarioAuxiliar mantenha os dados iniciais…
e se eu fizesse isso quando eu alterasse os dados de usuario afetaria tb o usuarioAuxiliar :D…

por isso que preciso fazer.

usuario = usuarioAuxiliar.clone;

Certo mas… não seria o caso de usar o pattern State ou Memento?

Sinceramente, eu procurei mta coisa sobre isso… pq vou precisar utilizar isso varias vezes…
pq eh o seguinte… no sistema aki… o socio do chefe… ele fez a parte de alterações…
e ele faz o seguinte… ele pega um objeto por exemplo com 20 atributos faz session.setAtribute de cada atributo…
e dps pega esse atributo e compra com o objeto no caso faz 20 if’s…
enfim eu terminei toda minha parte. e fui ver a dela e ta esse monte de trankeira e falei pra arrumar isso…
ai eu to procurando soluções mais claras e limpas pra todas as melecas que ele fez entende…

neste caso eu procurei varias coisas me indicaram o Observer mas sei lá n deu mto certo, ai eu achei q esse clone resolveria um pk mais o problema…
mas eu n conheço esses 2 patterns c tem alguma exemplo simples ai???
vo dar uma procurada tb…

tipo vo falar meu problema ai vc por conhecer pod me dizer se rola ou não…

bom eu tenho objeto gravado no banco certinho…
ai tenho uma consulta talz cada linha eu mando por setProperty para o objeto do bean… até ai blz.

agora ele crio uma pagina identica a d cadastro… q so no muda no caso o botao q eh atualizar com metodo atualizar -.-…
qual eh minha ideia utilizar a msm pagina e faço um rendered do botão dependendo d qual ação terá q executar…
pra isso eu preciso quando eu seleciono um objeto na consulta ele executa 1 metodo…

como ele mando o objeto da consulta para um objeto do MB…
eu precisaria de uma copia pra comparar algumas coisas.
mas como disse eu n posso fazer usuario = usuarioAuxiliar
todos nos sabemos pq neh…

esse eh o problema… qual pattern desse vc me indicaria?

[quote=ViniGodoy]É verdade, vc terá que fazer um try catch.

public Usuario clone(){ try { return (Usuario) super.clone(); } catch (CloneNotSupported e) {} }

Ainda é melhor que o throws, pois aí quem usa a classe poderá fazer:

Usuario u2 = u1.clone();

Sem ter que capturar exception alguma.
[/quote]

Muito bom tópico, mas ainda fiquei com uma dúvida:
suponhamos uma classe abstrata Pessoa conforme abaixo

public abstract class Pessoa { int matricula; String nome; }

e duas classes Funcionario e Aluno que herdam Pessoa

[code]public class Funcionario extends Pessoa {
List projetos;
}

public class Aluno extends Pessoa {
List disciplinas;
}
[/code]

e que eu tenha um metodo getPessoa que deve retornar Pessoa. Por questões de concistência dos dados eu preciso retornar uma cópia da pessoa, que será Aluno ou Funcionário.
Nesse caso eu terei que implementar o método clone() em cada um dos filhos, pois eles possuem tipos não primitivos e diferentes, certo?
Como minha classe pai é abstrata eu não posso fazer super.clone(); posso?
Assim, vou ter o método clone em Funcionário que irá copiar os dados de Pessoa e a sua lista de projetos e outro método clone em Aluno que também copiará explicitamente os atributos herdados de Pessoa + a sua lista de disciplinas, certo?

bom, como as listas de Funcionario e Aluno não são tipos primitívos nem imutáveis, também terei que implementar clone() na classe Disciplina e Projeto para não passar as referências dos meus objetos reais?