Wat is klonen in Java en zijn typen?



Dit artikel over klonen in Java geeft u gedetailleerde inzichten in het kloonproces en de verschillende soorten klonen die door Java worden ondersteund.

Tijdens het programmeren komen we vaak scenario's tegen waarin we een compleet stuk code moeten hergebruiken. Het herschrijven van de code maakt het programma omvangrijk, terwijl de efficiëntie van het programma afneemt. Java biedt ons dus een uitstekende functie die redding is van deze lastige taak. Dit staat bekend als klonen in Java en via het medium van dit artikel zal ik je er een volledig inzicht in geven.

Hieronder staan ​​de onderwerpen die ik in dit artikel zal bespreken:





Klonen in Java

Het klonen van objecten in Java is het proces waarbij een exacte kopie van het originele object wordt gemaakt. Met andere woorden, het is een manier om een ​​nieuw object te maken door alle gegevens en attributen van het originele object te kopiëren. Dit is alleen mogelijk door de methode clone () van het java.lang.Object klasse. De kloonmethode maakt een exacte kopie van een object waarvoor het is geweestaangeroepen in een veld-voor-veld toewijzingsvolgorde en zal de nieuwe objectverwijzing retourneren . Een ding dat u moet onthouden, in Java mogen de objecten die de klooninterface implementeren, wat een markeringsinterface is, de clone () gebruiken.

Nu u weet wat klonen in Java is, gaan we kijken naar de verschillende voordelen van het gebruik van deze functie.



Voordelen van klonen in Java

Hieronder heb ik een paar van de meest intrigerende kenmerken van het gebruik van klonen in Java opgesomd.

  • Helpt bij het verminderen van de coderegels.
  • De meest effectieve en efficiënte manier van kopiërenvoorwerpen.
  • Ook wordt de clone () beschouwd als de snelste methode om een ​​array te kopiëren.

Opmerking: hoewel het gebruik van klonen kan resulteren in enkele ontwerpproblemen, kan het u ten goede komen als u het op de juiste strategische manier gebruikt.

Soorten klonen in Java

Klonen in Java kan worden gegroepeerdin twee categorieën:



  1. Ondiep klonen
  2. Diep klonen

Laten we ze allemaal een voor een bekijken.

Ondiep klonen

In Java, wanneer het kloonproces wordt uitgevoerd door de methode clone () aan te roepen, wordt dit Shallow Cloning genoemd. Het is het standaard kloonproces in Java waarbij een ondiepe kopie van het originele object met exact veld wordt gemaakt. In het geval dat het originele object referenties heeft naar enkele andere objecten als velden, dan worden alleen de referenties van dat object gekloond in plaats van dat er nieuwe objecten worden gemaakt. Met andere woorden, als u de waarde van de gekloonde objecten wijzigt, wordt dit ook in het origineel weerspiegeld. Oppervlakkig klonen is dus afhankelijk van het oorspronkelijke object.

ondiepe kopie - Klonen in Java - EdurekaHieronder heb ik het voorbeeld van hetzelfde gegeven:

pakket edureka class EduCourse {String course1 String course2 String course3 openbare EduCourse (String crs1, String crs2, String crs3) {this.course1 = crs1 this.course2 = crs2 this.course3 = crs3}} class EduLearner implementeert Cloneable {int eduId String learnerName EduCourse eduCourse openbare EduLearner (int eduId, String learnerName, EduCourse eduCourse) {this.eduId = eduId this.learnerName = learnerName this.eduCourse = eduCourse} // Standaardversie van clone () methode beschermd Object clone () gooit CloneNotSupported .clone ()}} public class ShallowCloneSample {public static void main (String [] args) {EduCourse j2ee = new EduCourse ('Java', 'Spring', 'Microservices') EduLearner learner1 = nieuwe EduLearner (2811, 'Max' , j2ee) EduLearner learner2 = null try {// Een kloon van learner1 maken en deze toewijzen aan learner2 learner2 = (EduLearner) learner1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Details van Learner1 afdrukken Systeem.uit.p rintln ('Details of Learner 2:') System.out.println ('Id:' + learner1.eduId) System.out.println ('Name:' + learner1.learnerName) System.out.println ('Course Id: '+ learner1.eduCourse) // Afdrukken van alle cursussen van' learner1 'System.out.println (' Courses of Learner 1: ') System.out.println (learner1.eduCourse.course1) System.out.println (learner1. eduCourse.course2) System.out.println (learner1.eduCourse.course3) // Afdrukken details van Learner2 System.out.println ('Details of Learner 2:') System.out.println ('Id:' + learner2.eduId ) System.out.println ('Name:' + learner2.learnerName) System.out.println ('Course Id:' + learner2.eduCourse) // Alle cursussen van 'learner2' System.out.println ('Courses van Learner 2: ') System.out.println (learner2.eduCourse.course1) System.out.println (learner2.eduCourse.course2) System.out.println (learner2.eduCourse.course3) // De cursus3 van' learner2 wijzigen 'learner2.eduCourse.course3 =' JSP '// Deze wijziging wordt weerspiegeld in het originele' learner1 'System.out.println (' Bijgewerkte cursussen van Learner 2: ') System.out.println (learner1.eduCourse.course1) System.out.println (learner1.eduCourse.course2) System.out.println (learner1.eduCourse.course3)}}

Uitgang:

Details van leerling 2: Id: 2811 Naam: Max Course Id: EduCourse @ 15db9742 Cursussen van leerling 1: Java Spring Microservices Details van leerling 2: Id: 2811 Naam: Max Course Id: EduCourse @ 15db9742 Cursussen van leerling 2: Java Spring Microservices Bijgewerkte cursussen van leerling 2: Java Spring JSP

Diep klonen in Java

In Java, wanneer het kloonproces wordt uitgevoerd door de Cloneable-interface te implementeren, wordt dit Deep Cloning genoemd. Bij dit type klonen wordt een exacte kopie gemaakt van alle velden van het originele object. Maar in het geval dat het originele object verwijzingen naar andere objecten als velden heeft, dan wordt ook een kopie van die objecten gemaakt door de methode clone () aan te roepen. Dit maakt het gekloonde object onafhankelijk van het oorspronkelijke object en eventuele wijzigingen die in een van de objecten zijn aangebracht, worden niet doorgevoerd in het andere object.

leg het verschil uit tussen veranderlijke en onveranderlijke objecten.

Hieronder heb ik het voorbeeld van hetzelfde gegeven:

pakket edureka klasse EduCourse implementeert Cloneable {String course1 String course2 String course3 public EduCourse (String crs1, String crs2, String crs3) {this.course1 = crs1 this.course2 = crs2 this.course3 = crs3} protected Object clone () gooit CloneNotSupportedException { return super.clone ()}} class EduLearner implementeert Cloneable {int eduId String learnerName EduCourse eduCourse openbare EduLearner (int eduId, String learnerName, EduCourse eduCourse) {this.eduId = eduId // this.learnerName = learnerName = this.eduCourse} Het overschrijven van de methode clone () voor het maken van een diepe kopie van een object beschermd object clone () gooit CloneNotSupportedException {EduLearner learner = (EduLearner) super.clone () learner.eduCourse = (EduCourse) eduCourse.clone () return learner}} public class DeepCloneSample {public static void main (String [] args) {EduCourse j2ee = nieuwe EduCourse ('Java', 'Spring', 'Microservices') EduLearner learner1 = nieuwe EduLearner (2811, 'Max', j2ee) EduLearner learn er2 = null try {// Een kloon van leerling1 maken en deze toewijzen aan leerling2 leerling2 = (EduLearner) leerling1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Details van leerling1 System.out afdrukken. println ('Details of Learner 2:') System.out.println ('Id:' + learner1.eduId) System.out.println ('Name:' + learner1.learnerName) System.out.println ('Course Id: '+ learner1.eduCourse) // Afdrukken van alle cursussen van' learner1 'System.out.println (' Courses of Learner 1: ') System.out.println (learner1.eduCourse.course1) System.out.println (learner1. eduCourse.course2) System.out.println (learner1.eduCourse.course3) // Afdrukken details van Learner2 System.out.println ('Details of Learner 2:') System.out.println ('Id:' + learner2.eduId ) System.out.println ('Name:' + learner2.learnerName) System.out.println ('Course Id:' + learner2.eduCourse) // Alle cursussen van 'learner2' System.out.println ('Courses van Learner 2: ') System.out.println (learner2.eduCourse.course1) System.out.printl n (learner2.eduCourse.course2) System.out.println (learner2.eduCourse.course3) // Veranderen van de cursus3 van 'learner2' learner2.eduCourse.course3 = 'JSP' // Deze wijziging wordt niet weergegeven in het origineel ' learner1 'System.out.println (' Courses of Learner 1: ') System.out.println (learner1.eduCourse.course1) System.out.println (learner1.eduCourse.course2) System.out.println (learner1.eduCourse. course3) // Bijgewerkte cursussen van learner2 System.out.println ('Courses of Learner 2:') System.out.println (learner2.eduCourse.course1) System.out.println (learner2.eduCourse.course2) System.out. println (learner2.eduCourse.course3)}}

Uitgang:

Details van leerling 2: Id: 2811 Naam: Max Course Id: edureka.EduCourse@15db9742 Cursussen van leerling 1: Java Spring Microservices Details van leerling 2: Id: 2811 Naam: Max Course Id: edureka.EduCourse@6d06d69c Cursussen van leerling 2 : Java Spring Microservices Cursussen van Learner 1: Java Spring Microservices Cursussen van Learner 2: Java Spring JSP

Dit brengt ons bij het einde van dit artikel over klonen in Java. Als u meer wilt weten over Java, kunt u onze .

Nu je hebt begrepen wat klonen in Java is, kun je het door Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden leerlingen verspreid over de hele wereld. De training- en certificeringcursus Java J2EE en SOA van Edureka is bedoeld voor studenten en professionals die Java Developer willen worden. De cursus is bedoeld om u een voorsprong te geven in het programmeren van Java en u te trainen in zowel kern- als geavanceerde Java-concepten, samen met verschillende Java-frameworks zoals Hibernate & Spring.

Heeft u een vraag voor ons? Vermeld het in de commentarensectie van dit 'Klonen in Java' -artikel en we nemen zo snel mogelijk contact met u op.