Clonar objeto a partir do construtor da propria classe

Fala galera!
Creio que não criei nada novo, mas gostaria de uma opinião antes de sair utilizando nos projetos…
A ideia de criar um clone de um objeto através do construtor da própria classe é muito estranha??

public class Pessoa {

	private String nome;
	private Endereco endereco;

	public Pessoa() {}
	
	public Pessoa(String nome, Endereco endereco) {
		this.nome = nome;
		this.endereco = endereco;
	}

	//Construtor Clonador
	public Pessoa(Pessoa pessoa){		
		this.nome = pessoa.getNome();
		this.endereco = new Endereco(pessoa.getEndereco());		
	}
}


public class Endereco {

	private String descricao;
	
	public Endereco(){}
	
	public Endereco(String descricao) {
		this.descricao = descricao;
	}
	
	//construtor Clonador
	public Endereco(Endereco endereco) {

		this.descricao = endereco.getDescricao();
	}
}

É estranho sim. Que tal implementar o simples design pattern Prototype?

Na verdade "estranho" é algo bem subjetivo.

Na verdade essa é uma técnica até recomendada no Effective Java, no lugar do clone.

Um cuidado que você tem que ter (e você teve no seu código) é de também recriar os objetos internos da classe.

Mas o que o Joshua Bloch gosta mesmo e aconselha é simplesmente criar um método na classe concreta chamada clone.

Você tem referências disso?
Li novamente esta parte do livro para não falar bobagem e ele aconselha exatamente o contrário.

Procurei material a respeito e novamente, não encontrei nada que indicasse isso.

O único material aberto que encontrei foi isso:
http://www.artima.com/intv/bloch13.html

E novamente, não está aconselhando a usar.

Desaconselho usar o clone, ou qualquer método com esse nome, para não confundir com o clone de verdade - que é um lixo. A técnica do construtor de cópia não é ruim, e um método “clone-like” também não - mas eu o chamaria de copy.

Na verdade quem falou besteira fui eu. Li justamente um trecho do texto que o AbelBueno postou e como não o li inteiro interpretei errado.

Vocês estão corretos.

Mas, particularmente não gosto da ideia do construtor. Construtor não diz o que faz, não tem nome. Prefiro a criação de um método.

[quote=fredericomaia10]Na verdade quem falou besteira fui eu. Li justamente um trecho do texto que o AbelBueno postou e como não o li inteiro interpretei errado.

Vocês estão corretos.

Mas, particularmente não gosto da ideia do construtor. Construtor não diz o que faz, não tem nome. Prefiro a criação de um método.[/quote]

Um amigo aqui da empresa disse a mesma coisa.

[quote=AbelBueno]Na verdade essa é uma técnica até recomendada no Effective Java, no lugar do clone.

Um cuidado que você tem que ter (e você teve no seu código) é de também recriar os objetos internos da classe.[/quote]

Estava estudando para certificação com o SCJP Sun Certified Programmer for Java 6, quando me bateu a ideia de fazer o clone através do construtor.
Tinha certeza que alguém já tinha pensado nisso antes rs… esse Joshua Bloch manja muito!

Obrigado pelas dicas pessoal

Abs!

Clonar um objeto via construtor é algo que é esperado em um programa C++, onde esse tipo de coisa se chama “copy constructor”. (Em C++, quando se cria um copy constructor, também é costumeiro redefinir o operador de atribuição).

Em Java, prefere-se fazer um override do método clone.

Na teoria sim. Na prática, melhor evitar. Vide Joshua Boch, Effective Java.