Sobes.tech
Junior

Mida sa tead pindkopi kopeerimisest?

sobes.tech AI

Vastus AI-lt

Lame koop (shallow copy) loob uue objekti koopi, kuid ei koopi kõiki objekte, millele viitavad algse objekti väljad. Selle asemel kopeeritakse vaid viited.

Omadused:

  • Muutuvates objektides tehtud muudatused, millele viidatakse koopiates, on nähtavad nii algses objektis kui ka vastupidi.
  • Kiirem kui sügav koop, eriti objektide puhul, millel on palju viiteid.

Teostatakse näiteks clone() meetodiga (kui objekt implementeerib Cloneable) või käsitsi.

clone() näide:

// Loome klassi mutabellväljakuga
class Address {
    String city;

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

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

// Loome klassi, millel on viide Addressile, ja implementeerime Cloneable
class Person implements Cloneable {
    String name;
    Address address;

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

    // Teostame pinnapealse koopi Object.clone() abil
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

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

// Kasutuse näide
public class ShallowCopyExample {
    public static void main(String[] args) throws CloneNotSupportedException {
        Address originalAddress = new Address("New York");
        Person originalPerson = new Person("Alice", originalAddress);

        // Lame koop
        Person copiedPerson = (Person) originalPerson.clone();

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

        // Muudame algse objekti mutabellvälja...
        originalAddress.city = "Los Angeles";

        // Muudatused on nähtavad ka koopias, kuna viitavad sama Address objekti
        System.out.println("\nPärast algse aadressi muutmist:");
        System.out.println("Original Person: " + originalPerson);
        System.out.println("Kopeeritud Person: " + copiedPerson);
    }
}

Kasutatakse, kui ei ole vaja kogu objekti hierarhia täielikku koopiat või kui sisemised objektid on immutables.