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.