De kloonmethode en de te klonen interface - 1

"Hallo Amigo!"

"Hallo Kim."

"Ik ga je vertellen over de methode clone()."

"Het doel van deze methode is om een ​​object te klonen, of met andere woorden, om een ​​kloon/kopie/duplicaat van het object te maken."

"Wanneer deze methode wordt aangeroepen, maakt en retourneert de virtuele Java-machine een duplicaat van het object waarop het wordt aangeroepen.

De implementatie van de kloonmethode door de klasse Object is erg primitief: er wordt slechts één nieuw object gemaakt en de waarden van de velden van het oorspronkelijke object worden toegewezen aan de velden ervan.

Als het gekopieerde object verwijzingen naar andere objecten bevat, dan worden die verwijzingen gekopieerd. Er worden geen duplicaten van die objecten gemaakt."

"Hmm. Dat is niet veel om verder te gaan."

"Het punt is dat de virtuele Java-machine niet weet welke objecten wel of niet kunnen worden gekloond. Bestanden kunnen bijvoorbeeld niet worden gekloond. Hetzelfde geldt voor een System.in-stream."

"Dus de kwestie van volwaardig klonen werd voorgelegd aan de ontwikkelaars van een klas. "Dit is allemaal vergelijkbaar met hoe de methode gelijken wordt behandeld. Er is zelfs iets vergelijkbaars met hashCode: de Cloneable-interface."

"De Cloneable- interface is een zogenaamde 'marker-interface': het heeft geen methoden en wordt gebruikt om bepaalde klassen te markeren.

"Als de ontwikkelaar van een klasse gelooft dat objecten van de klasse kunnen worden gekloond, markeert hij deze met deze interface (dwz maakt de klasse Cloneable)."

"Als de ontwikkelaar de standaardimplementatie van de kloonmethode niet leuk vindt, moet hij er zelf een schrijven die op de juiste manier een duplicaatobject zal maken."

"Wanneer u de clone () -methode aanroept, controleert Java of het object de Cloneable-interface ondersteunt. Als dit het geval is, kloont het het object met behulp van de clone () -methode; zo niet, dan genereert het een CloneNotSupportedException."

"Met andere woorden, we moeten ofwel de kloonmethode overschrijven of de klasse Cloneable laten implementeren?"

"Ja, maar je moet de methode nog steeds overschrijven. De methode clone() is gedeclareerd als beschermd, dus hij kan alleen worden aangeroepen door klassen in zijn pakket (java.lang.*) of hun subklassen."

"Ik ben een beetje in de war, dus wat moet ik doen om een ​​object te klonen?"

"Als u de «standaard» kloonmethode van de klasse Object wilt gebruiken, moet u:

" a) Voeg de Cloneable-interface toe aan uw klas"

" b) Negeer de kloonmethode en roep de implementatie van de superklasse aan binnen uw implementatie:"

class Point implements Cloneable
{
 int x;
 int y;

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

"Of u kunt geheel zelf een implementatie van de kloonmethode schrijven:"

class Point
{
 int x;
 int y;

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

"Dat is een interessante methode. Ik weet zeker dat ik die zal gebruiken. Af en toe..."