O método clone e a interface Cloneable - 1

"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..."