Lasita-a klono en Java

Java Cloning

Java Klonado

Enkonduko

La Cloneable fasado en java estas signa fasado. Ĝi faras havi ajnan metodon. Sed se ni skribas klason kiel malsupre, Ĝi donas mesaĝon al la jvm ke la klaso povas esti klonita. La sekvanta kodo montras simplan objekton klonanta procezon –







[Kodo]

Pako Com.Hejme.Klonado;

Publika Klaso CloneClass Efektivigas Cloneable {

Int a;

Duoblo B;

// Klono de ĉi tiu metoda voka Objekto().

CloneClass getClone() {

Provo {

// Voka klono en Objekto.

Reveno (CloneClass) Ekstra.Klono();

} Kaptaĵo (CloneNotSupportedException e) {

Sistemo.Ekstere.Println (” Klonanta ne permesita. ” );

Reveno Tio ĉi;

}

}

}

[/Kodo]

Lasi nin kontroli la duan ekzemplon sub.

[Kodo]

Pako Com.Hejme.Klonado;

Publika Klaso TestCloneObject {

Publika Malplena TestIface() {

CloneClass x1 = Nova CloneClass();

CloneClass x2;

X1. = 15;

X1.B = 35.05;

X2 = x1.GetClone(); // Kloni x1

Sistemo.Ekstere.Println(” X1: ” + X1. + ” ” + X1.B);

Sistemo.Ekstere.Println(” X2: ” + X2. + ” ” + X2.B);

}

Publika Senmova Malplena Ĉefa(#La?i args[]) {

TestCloneObject testCloneObject = Nova TestCloneObject();

// Testo tra protektita

TestCloneObject.TestIface();

}

}

En la supra ekzemplo, La metodo [Kodo] GetClone [/Kodo] Vokas la [Kodo] Klono [/Kodo] Metodo en la objekto kaj revenas la objekton. Ĝi devas esti rimarkita ĉi tie ke la objekto kun estas revenita post la klonada mekanismo devas esti tipo ĵetis en ĝia konvena tipo, En ĉi tiu kazo ĝi estas

[Kodo] CloneClass [/Kodo]

Se la klaso ne estas efektiviganta la cloneable fasado, Kaj ni provas kloni tiun objekton ni akiras

[Kodo] CloneNotSupportedException [/Kodo]

En la procezo de klonado, La constructor ne estas vokita prefere ĝustan kopion de la dirita objekton estas kreita. Sed la objekto de kiu la klono estas kreita, Devas efektivigi la cloneable fasado.

La Klaso la klono de objekto() Metodo kreas kaj revenas kopion de la objekto, Kun la sama klaso kaj kun ĉiuj la kampoj havanta la samajn valorojn. Tamen, [Kodo] Objekto.Klono() [/Kodo] Ĵetas [Kodo] CloneNotSupportedException [/Kodo] Krom se la objekto estas okazo de klaso kiu efektivigas la Signa fasado Cloneable.

La defaŭlta efektivigo de [Kodo] Objekto.Klono()[/Kodo] Elfaras Malprofunda kopio. Se klaso postulas Profunda kopio Aŭ kelkaj alia laŭmenda konduto, Ĝi devas havi ĝia personigita [Kodo] Klono()[/Kodo] Metodo post kiam ili akiras la kopion de la superclass.







Avantaĝoj de klonado

Klonanta mekanismon savas kroman taskon de la ellaboranto en kazo ni devas krei kopion de objekto. Ni ne devas voki la [Kodo] Nova [/Kodo] Operacianto de la objekto. Kaj tiel klonanta savas multan kroman pretigan taskon de ellaboranto. Klono de objekto estas ĝusta kopio de la objekto.

Malavantaĝoj de klonado

Unu malavantaĝo de klonado estas ke la revena tipo de la [Kodo] Klono [/Kodo] Metodo estas [Kodo] Objekto [/Kodo]. Tial tipo ĵetanta estas postulita sur la kreita objekton.

Alia malavantaĝo estas ke ĝi ne eblas aliri la [Kodo] Klono [/Kodo] Metodo sur abstrakta tipo. plejpartoj de fasadoj kaj abstraktaj klasoj en Java ne havas la specifi publikon [Kodo] Klono [/Kodo] Metodo. Rezulte, La [Kodo] Klono [/Kodo] Metodo estas uzita nur se la reala klaso de objekto estas konata, Kiu estas kontraŭ la abstraction principo uzi la plej kolektiva tipo ebla. Ekzemple, Se unu havas Listan referencon en Java, Unu ne povas alvoki [Kodo] Klono [/Kodo] Metodo sur tiu referenco ĉar Listo specifas ne publikan klonon() Metodo. Realaj efektivigoj de Listo kiel ArrayList kaj LinkedList ĉiuj ĝenerale havas klonon() Metodoj si mem, Sed ĝi estas maloportuna kaj malbona abstraction porti ĉirkaŭ la reala klasa tipo de objekto.

Klonanta estas potenciale danĝera ago, Kiel ĝi povas havi kelkaj unintended flankaj efikoj. Ekz, Se la objekto estanta klonita enhavas referencon varia diri refObject, Tiam en la klonita objekton, RefObject havos la referencon de la sama objekto kiu la originala objekto estas plu-gvidanta al. Se la klono faras ŝanĝon en la enhavoj de la refObject, Tiam la ŝanĝo estos reflektita en la originala objekto ankaŭ. Konsideri la sekvantan ekzemplon – Se objekto malfermas I/O rivereton kaj estas tiam klonita, Tiam ambaŭ de la du objektoj estos kapablaj funkcii sur la sama rivereto. Cetere, Se unu el ĉi tiuj objektoj fermas la rivereton, Tiam la rivereto estas fermita por ambaŭ kaj se la duaj objektaj provoj skribi al ĝi, Tio ĉi kaŭzas eraron.

Pro tio ke klonado povas kaŭzi kelkajn problemojn, La [Kodo] Klono [/Kodo] Metodo. Do la [Kodo] Klono [/Kodo] Metodo devus esti vokita de ene de klaso kiu estas efektiviganta la [Kodo] Cloneable [/Kodo] Fasado kie la metodo vokanta la [Kodo] Klono [/Kodo] Metodo estas faris protektita, Aŭ ĝi devas esti eksplicite overridden de la klaso kiu estas publika. En la ekzemplo sur ni vidis klonadon de faranta la [Kodo] Klono [/Kodo] Protektita. La sekvanta ekzemplo ilustras la klonadan metodaron tra superreganta –

[Kodo]

Pako Com.Hejme.Klonado;

Publika Klaso CloneViaOverRiding Efektivigas Cloneable {

Int a;

Duoblo B;

// Klono() Estas nun overridden kaj estas publika.

Publika Objekta klono() {

Provo {

// Voka klono en Objekto.

Reveno Ekstra.Klono();

} Kaptaĵo (CloneNotSupportedException e) {

Sistemo.Ekstere.Println(“Klonanta ne permesita.”);

Reveno Tio ĉi;

}

}

}

[/Kodo]

Nun kontroli la sekvantan ekzemplon sub.

[Kodo]

Pako Com.Hejme.Klonado;

Publika Klaso TestCloneObject {

Publika Malplena TestPublic() {

CloneViaOverRiding x1 = Nova CloneViaOverRiding();

CloneViaOverRiding x2;

X1. = 10;

X1.B = 20.98;

// Ĉi tie, Klono() Estas vokita rekte.

X2 = (CloneViaOverRiding) X1. Klono ();

Sistemo.Ekstere.Println(“X1: ” + X1. + ” ” + X1.B);

Sistemo.Ekstere.Println(“X2: ” + X2. + ” ” + X2.B);

}

Publika Senmova Malplena Ĉefa(#La?i args[]) {

TestCloneObject testCloneObject = Nova TestCloneObject();

// Testo tra Publika

TestCloneObject.TestPublic();

}

}

[/Kodo]

En ĉi tiu ekzemplo la metodo, La metodo [Kodo] Klono [/Kodo] De la objekta klaso estas overridden kiu estas kial ĝi estas deklarita publikon en kontrasto al la pli frua ekzemplo, Kie la [Kodo] GetClone [/Kodo] Ne havas ajnajn alirajn modifilojn faranta ĝin alirebla nura ĉe la paka nivelo.

En aŭ de ĉi tiuj du alproksimiĝoj, Efektiviganta la cloneable fasado estas deviga.

La flankaj efikoj kaŭzita de klonado estas foje malfacila identigi en la komenca nivelo. Ĝi estas facile pensi ke klaso estas sekura por klonanta kiam ĝin efektive ne estas. En generalo, Ne estas konsilita efektivigi la Cloneable fasado por ajna klaso sen havanta solidan komercan teron .







Alternativa al klonado

Klonanta mekanismon havas malabundajn alternativojn –

  • Kopii constructor – Kopio constructor estas constructor kiu akceptas alian okazon de la sama klaso kiel parametro.
  • Fabrika metodo – Ĉi tiuj metodoj ne estas ĉiam adekvataj kiam la konkreta tipo de la klonita objekton ne estas sciita en antaŭenigo.
  • Uzo de serialization kaj deserialization estas alia alternativa al uzanta klonon.

Konkludo

  • Objekta klonado estas la mekanismo krei kopion de ekzistanta objekto
  • Klonanta sekvas la malprofundan kopian mekanismon
  • Fermanta savas kelkajn kromajn taskojn de la ellaboranto
  • Unufoje la klonado estas farita la kreita klonan objekton estas postulita al eksplicite ĵetis je al la postulata tipo
  • Klonanta havas kelkajn flankajn efikojn e.G se objekto kiu estas klonita havas referencon al alia objekto, Kaj la nova klonita objekton modifas la objekton kiu estado referencis, Tiam la originala objekto ankaŭ akiras ŝanĝita.
  • Klonanta mekanismon havas kelkajn alternativojn – La kopio constructor, Fabrika metodo, serialization kaj de-serialization.
Etikedita sur: ,
============================================= ============================================== Buy best TechAlpine Books on Amazon
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share