Sobes.tech
Junior
158

Ką žinai apie paviršiaus kopijavimą?

Atsakymas iš AI

sobes.tech AI

Поверхностное копирование (shallow copy) создает новую копию объекта, но не копирует объекты, на которые ссылаются поля исходного объекта. Скорее, копируются сами ссылки.

Особенности:

  • Изменения в мутабельных объектах, на которые ссылаются копии, будут видны в исходном объекте и наоборот.
  • Быстрее, чем глубокое копирование для объектов со множеством ссылок.

Реализуется, например, методом clone() (если объект реализует Cloneable) или вручную.

Пример clone():

// Создаем класс с мутабельным полем
class Address {
    String city;

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

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

// Создаем класс с ссылкой на Address, реализуем Cloneable
class Person implements Cloneable {
    String name;
    Address address;

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

    // Реализуем поверхностное копирование через Object.clone()
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

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

// Пример использования
public class ShallowCopyExample {
    public static void main(String[] args) throws CloneNotSupportedException {
        Address originalAddress = new Address("New York");
        Person originalPerson = new Person("Alice", originalAddress);

        // Поверхностное копирование
        Person copiedPerson = (Person) originalPerson.clone();

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

        // Изменяем мутабельное поле во вложенном объекте исходного...
        originalAddress.city = "Los Angeles";

        // ...изменения видны и в копии, так как ссылаются на один и тот же объект Address
        System.out.println("\nAfter modifying original address:");
        System.out.println("Original Person: " + originalPerson);
        System.out.println("Copied Person: " + copiedPerson);
    }
}

Применяется, когда нет необходимости в полном дублировании всей иерархии объектов, или когда вложенные объекты являются иммутабельными.