Java Copy Constructor

1. Bemutatkozás

A Java osztályban található másoló konstruktor egy olyan konstruktor, amely létrehoz egy objektumot ugyanazon Java osztály másik objektumával.

Ez hasznos, ha egy összetett, több mezővel rendelkező objektumot akarunk lemásolni, vagy amikor egy meglévő objektumból mély másolatot akarunk készíteni.

2. Hogyan készítsünk másolatkészítőt

Másolat-készítő létrehozásához először deklarálhatunk egy konstruktort, amely azonos típusú objektumot vesz fel paraméterként:

public class Alkalmazott {private int id; privát karakterlánc neve; állami alkalmazott (alkalmazott alkalmazott) {}}

Ezután bemásoljuk a bemeneti objektum minden mezőjét az új példányba:

public class Alkalmazott {private int id; privát karakterlánc neve; közalkalmazott (alkalmazott alkalmazott) {this.id = alkalmazott.id; ez.név = alkalmazott.név; }}

Ami itt van, az a sekély példány, ami rendben van, mivel minden mezőnk - an int és a Húr ebben az esetben - vagy primitív, vagy változhatatlan típusok.

Ha a Java osztálynak módosítható mezői vannak, akkor ehelyett készíthetünk egy mély másolat a másolatkészítőjében. Mély másolat esetén az újonnan létrehozott objektum független az eredetitől, mert minden egyes módosítható objektumból külön másolatot készítünk:

public class Alkalmazott {private int id; privát karakterlánc neve; private Date startDate; közalkalmazott (alkalmazott alkalmazott) {this.id = alkalmazott.id; ez.név = alkalmazott.név; this.startDate = new Date (alkalmazott.startDate.getTime ()); }}

3. Copy Constructor vs. Clone

A Java-ban a klón módszer egy objektum létrehozására egy meglévő objektumból. A másolatkészítőnek azonban van néhány előnye a klón módszer:

  1. A másoló szerkesztő sokkal könnyebben megvalósítható. Nincs szükségünk a Klónozható interfész és fogantyú CloneNotSupportedException.
  2. A klón metódus ad vissza egy általános Tárgy referencia. Ezért tipizálnunk kell a megfelelő típusra.
  3. Nem rendelhetünk értéket a-hoz végső mező a klón módszer. Megtehetjük azonban a másolatkészítőben.

4. Öröklési kérdések

A Java-ban található másolókonstruktorok nem örökölhetők alosztályok szerint. Ezért, ha megpróbálunk inicializálni egy gyermek objektumot egy szülő osztály referenciájából, casting kérdéssel állunk szemben amikor a másolatkészítővel klónozták.

A probléma illusztrálásához először hozzunk létre egy alosztályt Munkavállaló és másolatkészítője:

a nyilvános osztály menedzsere kiterjeszti az alkalmazottak {privát listája közvetlen jelentéseket; // ... más konstruktorok nyilvános menedzser (menedzser menedzser) {szuper (menedzser.id, menedzsernév, menedzser.startDate); this.directReports = directReports.stream () .collect (Collectors.toList ()); }} 

Aztán kijelentjük a Munkavállaló változó és példányosítsa a Menedzser konstruktőr:

Munkavállalói forrás = új menedzser (1, "Baeldung Manager", startDate, directReports);

Mivel a referencia típusa az Munkavállaló, nekünk kell leadnunk Menedzser típusú, hogy használhassuk a Menedzser osztály:

Alkalmazott klón = új menedzser ((menedzser) forrás);

Lehet, hogy megkapjuk ClassCastException futás közben, ha a bemeneti objektum nem a Menedzser osztály.

Az egyik módja annak, hogy elkerüljük a másolástervezőben történő átküldést, egy új öröklődő módszer létrehozása mindkét osztály számára:

public class Alkalmazott {public Employee copy () {return new Employee (this); }} public class Manager kiterjeszti az alkalmazottakat {@Orride public Employee copy () {return new Manager (this); }}

Minden osztály metódusban a bemenetével hívjuk meg annak másolat-készítőjét ez tárgy. Ily módon garantálhatjuk, hogy a létrehozott objektum megegyezik a hívó objektummal:

Munkavállalói klón = forrás.másolat ();

5. Következtetés

Ebben az oktatóanyagban bemutattuk, hogyan készítsünk másolat-készítőt néhány kódpéldával. Több okot is megvitattunk, miért kellene kerülnünk a klón módszer.

A másoló konstruktornak casting problémája van, amikor egy gyermek osztály objektum klónozására használjuk, amelynek referencia típusa a szülő osztály. Egy megoldást adtunk erre a kérdésre.

Mint mindig, az oktatóanyag forráskódja elérhető a GitHubon.