Sobes.tech
Junior

Yüzey nüsxə haqqında nə bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Yüzeysel nüsxə (shallow copy) obyektin yeni nüsxəsini yaradır, lakin orijinal obyektin sahələrində istinad etdiyi obyektləri nüsxələməz. Əvəzində, sadəcə istinadlar kopyalanır.

Xüsusiyyətlər:

  • Nüsxələr tərəfindən istinad edilən dəyişkən obyektlərdəki dəyişikliklər orijinal obyektə və əksinə görünəcək.
  • Bir çox istinada malik obyektlər üçün dərin nüsxədən daha sürətlidir.

Məsələn, clone() metodu (əgər obyekt Cloneable-i implement edirsə) və ya əl ilə həyata keçirilə bilər.

clone() nümunəsi:

// Dəyişkən sahəyə malik sinif yaradırıq
class Address {
    String city;

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

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

// Address-ə istinad edən və `Cloneable`-i implement edən sinif yaradırıq
class Person implements Cloneable {
    String name;
    Address address;

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

    // Object.clone() vasitəsilə səthi nüsxə
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

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

// İstifadə nümunəsi
public class ShallowCopyExample {
    public static void main(String[] args) throws CloneNotSupportedException {
        Address originalAddress = new Address("New York");
        Person originalPerson = new Person("Alice", originalAddress);

        // Yüzeysel nüsxə
        Person copiedPerson = (Person) originalPerson.clone();

        System.out.println("Orijinal şəxs: " + originalPerson);
        System.out.println("Kopyalanmış şəxs: " + copiedPerson);

        // Orijinalin iç içə olan sahəsini dəyişirik...
        originalAddress.city = "Los Angeles";

        // ...dəyişikliklər həm də kopyada görünür, çünki hər ikisi eyni Address obyektinə istinad edir
        System.out.println("\nOrijinal ünvanı dəyişdikdən sonra:");
        System.out.println("Orijinal şəxs: " + originalPerson);
        System.out.println("Kopyalanmış şəxs: " + copiedPerson);
    }
}

İstifadə olunur, çünki obyektlərin bütün hiyerarşisini tam surət etmək lazım deyil və ya iç içə obyektlər dəyişməzdir.