Klonemetoden og det klonbare grensesnittet - 1

"Hei, Amigo!"

"Hei, Kim."

"Jeg skal fortelle deg om klone()-metoden."

"Poenget med denne metoden er å klone et objekt, eller med andre ord, å lage en klone/kopi/duplikat av objektet."

"Når denne metoden kalles, oppretter og returnerer den virtuelle Java-maskinen et duplikat av objektet den kalles på.

Objekt-klassens implementering av klonemetoden er veldig primitiv: bare ett nytt objekt opprettes, og verdiene til det opprinnelige objektets felter tilordnes dets felt.

Hvis det kopierte objektet inneholder referanser til andre objekter, vil disse referansene bli kopiert. Duplikater av disse objektene vil ikke bli opprettet."

"Hmm. Det er ikke mye å gå på."

"Tingen er at den virtuelle Java-maskinen ikke vet hvilke objekter som kan eller ikke kan klones. Filer kan for eksempel ikke klones. Det samme gjelder for en System.in-strøm."

"Så spørsmålet om fullverdig kloning ble sendt til en klasses utviklere. "Dette ligner på hvordan likhetsmetoden håndteres. Det er til og med noe som kan sammenlignes med hashCode: det klonebare grensesnittet."

"Det klonbare grensesnittet er det som kalles et "markørgrensesnitt": det har ingen metoder og brukes til å merke visse klasser.

"Hvis en klasses utvikler tror at objekter i klassen kan klones, merker han det med dette grensesnittet (dvs. gjør klassen implementere Klonbar)."

"Hvis utvikleren ikke liker klonemetodens standardimplementering, må han skrive sin egen som vil lage et duplikatobjekt på riktig måte."

"Når du kaller klone ()-metoden, sjekker Java om objektet støtter Cloneable-grensesnittet. Hvis det gjør det, kloner det objektet ved å bruke klone ( )-metoden; hvis ikke, kaster det en CloneNotSupportedException."

"Med andre ord, vi må enten overstyre klonemetoden eller gjøre klassen til å implementere klonbar?"

"Ja, men du må fortsatt overstyre metoden. Clone()-metoden er erklært som beskyttet, så den kan bare kalles opp av klasser i pakken (java.lang.*) eller deres underklasser."

"Jeg er litt forvirret - så hva må jeg gjøre for å klone et objekt?"

"Hvis du vil bruke Object-klassens «default»-kloningsmetode, må du:

" a) Legg til det klonbare grensesnittet til klassen din"

" b) Overstyr klonemetoden og kall superklassens implementering i implementeringen din:"

class Point implements Cloneable
{
 int x;
 int y;

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

"Eller du kan skrive en implementering av klonemetoden 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 kommer til å bruke den. Av og til..."