Sobes.tech
Middle

Kas ir kopēšanas konstruktoru?

sobes.tech AI

Atbilde no AI

Kopēšanas konstruktor ir īpašs klases konstruktors, kas izveido jaunu objektu, kopējot esošā objekta lauku vērtības tajā pašā klasē. To izmanto dziļai kopēšanai, kad nepieciešams izveidot neatkarīgu objekta kopiju, ieskaitot visus atsauces laukus.

Piemērs:

public class MyClass {
    private int value;
    private List<String> data;

    // Kopēšanas konstruktors
    public MyClass(MyClass other) {
        this.value = other.value; // Primitīva tipa kopēšana
        this.data = new ArrayList<>(other.data); // Dziļa saraksta kopēšana
    }

    // Parasts konstruktors
    public MyClass(int value, List<String> data) {
        this.value = value;
        this.data = new ArrayList<>(data);
    }

    // Getter un setter...

    public static void main(String[] args) {
        List<String> originalData = new ArrayList<>();
        originalData.add("item1");
        originalData.add("item2");

        MyClass original = new MyClass(10, originalData);
        MyClass copy = new MyClass(original); // Izmantojot kopēšanas konstruktoru

        System.out.println("Oriģināla vērtība: " + original.value + ", dati: " + original.data);
        System.out.println("Kopijas vērtība: " + copy.value + ", dati: " + copy.data);

        // Izmaiņas kopijā neietekmē oriģinālu
        copy.data.add("item3");
        System.out.println("Oriģināla dati pēc izmaiņām: " + original.data);
        System.out.println("Kopijas dati pēc izmaiņām: " + copy.data);
    }
}

Atšķirība no virsmas kopēšanas (piemēram, ar Object.clone() pēc noklusējuma vai vienkāršu atsauču piešķiršanu):

  • Virsmas kopēšana: Kopē tikai lauku vērtības un atsauces uz objektiem. Objekti, uz kuriem atsaucas lauki, paliek kopīgi oriģinālam un kopijai. Izmaiņas vienā objektā ietekmēs otru.
  • Dziļa kopēšana: Tiek izveidots jauns objekts un rekursīvi kopēti visi iekšējie objekti, uz kuriem atsaucas lauki. Oriģināls un kopija ir pilnīgi neatkarīgi. Izmaiņas vienā neietekmēs otru.

Kopēšanas konstruktors ir idiomatisks veids (idiomatic way) Java valodā, lai veiktu dziļu kopēšanu, īpaši, ja nepieciešams kontrolēt kopijas izveides procesu.