Junior
Mit tud a felületi másolásról?
sobes.tech MI
Válasz az MI-től
A felületi másolat (shallow copy) létrehoz egy új példányt az objektumból, de nem másolja azokat az objektumokat, amelyekre a forrásobjektum mezői hivatkoznak. Ehelyett csak a hivatkozásokat másolja.
Jellemzők:
- A másolat által hivatkozott módosítható objektumokban végrehajtott változtatások láthatók lesznek az eredeti objektumban és fordítva.
- Gyorsabb, mint a mélymásolat olyan objektumok esetén, amelyek sok hivatkozást tartalmaznak.
Például a clone() metódussal (ha az objektum implementálja a Cloneable-t) vagy kézzel is megvalósítható.
A clone() példája:
// Létrehozunk egy osztályt egy módosítható mezővel
class Address {
String city;
public Address(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
'}';
}
}
// Létrehozunk egy osztályt, amely hivatkozik az Address-re, és implementálja a Cloneable-t
class Person implements Cloneable {
String name;
Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
// Felületi másolat Object.clone() segítségével
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", address=" + address +
'}';
}
}
// Használati példa
public class ShallowCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
Address originalAddress = new Address("New York");
Person originalPerson = new Person("Alice", originalAddress);
// Felületi másolat
Person copiedPerson = (Person) originalPerson.clone();
System.out.println("Eredeti személy: " + originalPerson);
System.out.println("Másolt személy: " + copiedPerson);
// Módosítjuk az eredeti belső mezőt...
originalAddress.city = "Los Angeles";
// ...a változások láthatók a másolaton is, mivel mindkettő ugyanarra az Address objektumra mutat
System.out.println("\nAz eredeti cím módosítása után:");
System.out.println("Eredeti személy: " + originalPerson);
System.out.println("Másolt személy: " + copiedPerson);
}
}
Alkalmazható, amikor nem szükséges az egész objektumhierarchia másolása, vagy amikor a belső objektumok immutábilisak.