Sobes.tech
Junior
166

Жогорку көчүрмө жөнүндө эмне билесиң?

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);
    }
}

Бул ыкма, бардык объекттердин хиерархиясын толук көчүрүүнү талап кылбаган учурда же ички объекттер immutable болсо колдонулат.