Sobes.tech
Junior
168

Ինչ գիտես մակերեսային պատճենման մասին?

Պատասխան 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);
    }
}

Կիրառվում է, երբ անհրաժեշտ չէ ամբողջ օբյեկտների հիերարխիայի լիարժեք կրկնօրինակում կամ երբ ներսի օբյեկտները անփոփոխ են։