Clonar objeto a partir do construtor da propria classe

10 respostas
freakazoid

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();
	}
}

10 Respostas

fredericomaia10

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

Na verdade "estranho" é algo bem subjetivo.
A

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.

fredericomaia10

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

A

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.

jcranky

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.

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.

freakazoid

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.

Um amigo aqui da empresa disse a mesma coisa.

freakazoid

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.

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!

E

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.

jcranky

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

Criado 24 de junho de 2013
Ultima resposta 25 de jun. de 2013
Respostas 10
Participantes 5