
"Olá, amigo!"
"Oi, Kim."
"Vou falar sobre o método clone()."
"O objetivo desse método é clonar um objeto, ou em outras palavras, criar um clone/cópia/duplicata do objeto."
"Quando esse método é chamado, a máquina virtual Java cria e retorna uma duplicata do objeto no qual é chamada.
A implementação da classe Object do método clone é muito primitiva: apenas um novo objeto é criado e os valores dos campos do objeto original são atribuídos a seus campos.
Se o objeto copiado contiver referências a outros objetos, essas referências serão copiadas. Duplicatas desses objetos não serão criadas."
"Hmm. Isso não é muito para continuar."
"O problema é que a máquina virtual Java não sabe quais objetos podem ou não ser clonados. Por exemplo, arquivos não podem ser clonados. O mesmo vale para um fluxo System.in."
"Portanto, a questão da clonagem completa foi lançada para os desenvolvedores de uma classe. "Isso tudo é semelhante a como o método equals é tratado. Existe até algo comparável ao hashCode: a interface Cloneable."
"A interface Cloneable é o que chamamos de 'interface de marcador': ela não possui nenhum método e é usada para marcar certas classes.
"Se o desenvolvedor de uma classe acredita que os objetos da classe podem ser clonados, ele marca isso com esta interface (ou seja, torna a implementação da classe Cloneable)."
"Se o desenvolvedor não gostar da implementação padrão do método clone, ele deve escrever o seu próprio que criará um objeto duplicado da maneira correta."
"Quando você chama o método clone (), o Java verifica se o objeto suporta a interface Cloneable. Em caso afirmativo, ele clona o objeto usando o método clone (); caso contrário, ele lança uma CloneNotSupportedException."
"Em outras palavras, devemos substituir o método clone ou fazer com que a classe implemente Cloneable?"
"Sim, mas você ainda precisa sobrescrever o método. O método clone() é declarado como protegido, então ele só pode ser chamado por classes em seu pacote (java.lang.*) ou suas subclasses."
"Estou um pouco confuso - então o que preciso fazer para clonar um objeto?"
"Se você quiser usar o método de clonagem «padrão» da classe Object, você precisa:
" a) Adicione a interface Cloneable à sua classe"
" b) Substitua o método clone e chame a implementação da superclasse dentro de sua implementação:"
class Point implements Cloneable
{
int x;
int y;
public Object clone()
{
return super.clone();
}
}
"Ou você pode escrever uma implementação do método clone inteiramente por conta própria:"
class Point
{
int x;
int y;
public Object clone()
{
Point point = new Point();
point.x = this.x;
point.y = this.y;
return point;
}
}
"Esse é um método interessante. Tenho certeza que vou usá-lo. Ocasionalmente..."
GO TO FULL VERSION