Alguém usa clone() método de Object?

Sobrescreví o método clone()… Mas ainda estou com dificuldades em relação aos contextos que posso implementá-lo…

@Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }

abraço, :smiley:
André AS

  1. Ao sobrescrever o método clone() retire o “throws CloneNotSupportedException”. Não faz sentido lançar essa exception se você vai dar suporte ao método;
  2. Se você só tiver tipos primitivos e objetos imutáveis, basta fazer super.clone(). Se tiver objetos mutáveis entre seus atributos, terá que copiá-los também.
  3. Geralmente é preferível criar um construtor de cópia, no lugar do método clone().
  4. Você também deve implementar a interface Cloneable.

Exemplo:

Suponha a classe cliente, com os seguintes atributos (suprimi a implementação de gets e sets):

[code]public class Cliente {
private String nome;
private String endereço;
private int numero;

private List lojas;
}[/code]

Para suportar o clone, você faria o seguinte:

[code]public class Cliente implements Cloneable {
private String nome;
private String endereço;
private int numero;

private List lojas;

@Override
public Cliente clone() {
Cliente c = (Cliente) super.clone(); //Chama o clone de Object. Isso copia automaticamente todos os atributos.
//Como a lista de lojas é mutável, o ideal é copia-la também. Senão a alteração da lista num cliente afetará o outro.
c.lojas = new ArrayList(lojas);
//String é um objeto, mas é imutável. Podemos compartilha-lo.
}
}[/code]

O método que usa isso poderia ser o seguinte. Vamos supor que você queira que o filho de um de seus clientes também tenha um cadastro de cliente. Geralmente, ele vai ter praticamente todos os dados do pai dele (mesmo endereço, número, cep, telefone residencial, etc.). Então, você poderia criar um baseado no outro:

Cliente filho = pai.clone();

E então colocar esse filho na tela de cadastro, para que o atendente altere só o que for pertinente.

Note que nem sempre os clones são perfeitos. Se sua classe cliente tem um id, por exemplo, talvez o clone dela alterasse o id para -1. Não existe uma regra prática ou uma recomendação geral se isso é uma boa prática ou não.

2 curtidas

Em java eu nunca precisei usar o método clone(), até prq todos os wappers e a classe String não imutáveis, em uma linguagem onde a classe String é mutável, como por exemplo Ruby, é legal passar, o String.clone (quando for passar uma string como parâmetro de um método) para vc não ficar maluco se perdendo nas referencias, caso algum método altere essa String mutável (a alteração vai se refletir em toda a arvore de passagem de parâmetros dos métodos).

Muito obrigado pela explicação ViniGodoy!

De nada, tive que reler o tópico para entender de que explicação vc tava falando. heheheheh