Sobes.tech
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.