Sobes.tech
Junior

Čo vieš o povrchovom kopírovaní?

sobes.tech AI

Odpoveď od AI

Povrchové kopírovanie (shallow copy) vytvára novú kópiu objektu, ale nekopíruje objekty, na ktoré sa odkazujú polia pôvodného objektu. Skôr sa kopírujú samotné odkazy.

Charakteristiky:

  • Zmeny v mutovateľných objektoch, na ktoré sa odkazujú kópie, budú viditeľné v pôvodnom objekte a naopak.
  • Je rýchlejšie ako hlboké kopírovanie pre objekty s množstvom odkazov.

Implementuje sa napríklad metódou clone() (ak objekt implementuje Cloneable) alebo manuálne.

Príklad clone():

// Vytvárame triedu s mutovateľným poľom
class Address {
    String city;

    public Address(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
               "city='" + city + '\'' +
               '}';
    }
}

// Vytvárame triedu s odkazom na Address, implementujeme Cloneable
class Person implements Cloneable {
    String name;
    Address address;

    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    // Implementujeme povrchové kopírovanie pomocou Object.clone()
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Person{" +
               "name='" + name + '\'' +
               ", address=" + address +
               '}';
    }
}

// Príklad použitia
public class ShallowCopyExample {
    public static void main(String[] args) throws CloneNotSupportedException {
        Address originalAddress = new Address("New York");
        Person originalPerson = new Person("Alice", originalAddress);

        // Povrchové kopírovanie
        Person copiedPerson = (Person) originalPerson.clone();

        System.out.println("Original Person: " + originalPerson);
        System.out.println("Copied Person: " + copiedPerson);

        // Meníme mutovateľné pole v pôvodnom objekte...
        originalAddress.city = "Los Angeles";

        // ...zmeny sú viditeľné aj v kópii, pretože odkazujú na ten istý objekt Address
        System.out.println("\nAfter modifying original address:");
        System.out.println("Original Person: " + originalPerson);
        System.out.println("Copied Person: " + copiedPerson);
    }
}

Používa sa, keď nie je potrebné úplné duplikovanie celej hierarchie objektov alebo keď sú vložené objekty immutable.