Klonmetoden och det klonbara gränssnittet - 1

"Hej, Amigo!"

"Hej Kim."

"Jag ska berätta om metoden clone()."

"Poängen med denna metod är att klona ett objekt, eller med andra ord, att skapa en klon/kopia/duplicering av objektet."

"När den här metoden anropas skapar den virtuella Java-maskinen och returnerar en dubblett av objektet den anropas på.

Objektklassens implementering av klonmetoden är mycket primitiv: endast ett nytt objekt skapas, och värdena för det ursprungliga objektets fält tilldelas dess fält.

Om det kopierade objektet innehåller referenser till andra objekt, kommer dessa referenser att kopieras. Dubbletter av dessa objekt kommer inte att skapas."

"Hmm. Det är inte mycket att gå på."

"Saken är att den virtuella Java-maskinen inte vet vilka objekt som kan eller inte kan klonas. Till exempel kan filer inte klonas. Detsamma gäller för en System.in-ström."

"Så frågan om fullfjädrad kloning ställdes till en klass utvecklare. "Detta liknar hur likametoden hanteras. Det finns till och med något som kan jämföras med hashCode: det kloningsbara gränssnittet."

"Det klonbara gränssnittet är vad som kallas ett "markörgränssnitt": det har inga metoder och används för att markera vissa klasser.

"Om en klass utvecklare tror att objekt i klassen kan klonas, markerar han det med det här gränssnittet (dvs. gör att klassen implementerar kloningsbar)."

"Om utvecklaren inte gillar klonmetodens standardimplementering måste han skriva en egen som kommer att skapa ett duplicerat objekt på rätt sätt."

"När du anropar metoden clone () kontrollerar Java om objektet stöder det Cloneable-gränssnittet. Om det gör det, klonas det objektet med metoden clone (); om inte, kastar det en CloneNotSupportedException."

"Med andra ord måste vi antingen åsidosätta klonmetoden eller göra klassen implementera Klonbar?"

"Ja, men du måste fortfarande åsidosätta metoden. Clone()-metoden deklareras som skyddad, så den kan bara anropas av klasser i dess paket (java.lang.*) eller deras underklasser."

"Jag är lite förvirrad - så vad behöver jag göra för att klona ett objekt?"

"Om du vill använda Object-klassens «default»-kloningsmetod måste du:

" a ) Lägg till det kloningsbara gränssnittet till din klass"

" b) Åsidosätt klonmetoden och anropa superklassens implementering i din implementering:"

class Point implements Cloneable
{
 int x;
 int y;

 public Object clone()
 {
  return super.clone();
 }
    }

"Eller så kan du skriva en implementering av klonmetoden helt på egen hand:"

class Point
{
 int x;
 int y;

 public Object clone()
 {
  Point point = new Point();
  point.x = this.x;
  point.y = this.y;
  return point;
 }
}

"Det är en intressant metod. Jag är säker på att jag kommer att använda den. Ibland..."