Klonemetoden og den klonbare grænseflade - 1

"Hej, Amigo!"

"Hej, Kim."

"Jeg vil fortælle dig om clone()-metoden."

"Pointen med denne metode er at klone et objekt, eller med andre ord at skabe en klon/kopi/duplikat af objektet."

"Når denne metode kaldes, opretter og returnerer den virtuelle Java-maskine en duplikat af det objekt, den kaldes på.

Object-klassens implementering af klonmetoden er meget primitiv: Der oprettes kun ét nyt objekt, og værdierne af det originale objekts felter tildeles dets felter.

Hvis det kopierede objekt indeholder referencer til andre objekter, vil disse referencer blive kopieret. Dubletter af disse objekter vil ikke blive oprettet."

"Hmm. Det er ikke meget at komme efter."

"Sagen er, at den virtuelle Java-maskine ikke ved, hvilke objekter der kan eller ikke kan klones. For eksempel kan filer ikke klones. Det samme gælder for en System.in-stream."

"Så spørgsmålet om fuldgyldig kloning blev stillet til en klasses udviklere. "Dette ligner alt sammen, hvordan equals-metoden håndteres. Der er endda noget, der kan sammenlignes med hashCode: den klonbare grænseflade."

"Den klonbare grænseflade er det, der kaldes en 'markørgrænseflade': den har ingen metoder og bruges til at markere bestemte klasser.

"Hvis en klasses udvikler mener, at objekter i klassen kan klones, markerer han det med denne grænseflade (dvs. gør klassen implementerer Klonbar)."

"Hvis udvikleren ikke kan lide klonmetodens standardimplementering, skal han skrive sin egen, der vil skabe et dubletobjekt på den rigtige måde."

"Når du kalder clone ()-metoden, tjekker Java, om objektet understøtter Cloneable-grænsefladen. Hvis det gør, kloner det objektet ved hjælp af clone ( )-metoden; hvis ikke, kaster det en CloneNotSupportedException."

"Med andre ord skal vi enten tilsidesætte klonmetoden eller få klassen til at implementere Klonbar?"

"Ja, men du skal stadig tilsidesætte metoden. Clone()-metoden er erklæret som beskyttet, så den kan kun kaldes af klasser i dens pakke (java.lang.*) eller deres underklasser."

"Jeg er lidt forvirret - så hvad skal jeg gøre for at klone et objekt?"

"Hvis du vil bruge Object-klassens «default»-kloningsmetode, skal du:

" a) Tilføj den kloningsbare grænseflade til din klasse"

" b) Tilsidesæt klonmetoden og kald superklassens implementering i din implementering:"

class Point implements Cloneable
{
 int x;
 int y;

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

"Eller du kan skrive en implementering af klonmetoden helt på egen hånd:"

class Point
{
 int x;
 int y;

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

"Det er en interessant metode. Jeg er sikker på, at jeg vil bruge den. Af og til..."