Sobes.tech
Junior

O que sabes sobre cópia superficial?

sobes.tech IA

Resposta da IA

A cópia superficial (shallow copy) cria uma nova cópia do objeto, mas não copia os objetos aos quais os campos do objeto original fazem referência. Em vez disso, apenas as referências são copiadas.

Características:

  • As alterações nos objetos mutáveis referenciados pelas cópias serão visíveis no objeto original e vice-versa.
  • É mais rápida do que a cópia profunda para objetos com muitas referências.

É implementada, por exemplo, pelo método clone() (se o objeto implementar Cloneable) ou manualmente.

Exemplo de clone():

// Criar uma classe com um campo mutável
class Address {
    String city;

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

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

// Criar uma classe com uma referência a Address, que implementa Cloneable
class Person implements Cloneable {
    String name;
    Address address;

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

    // Implementar cópia superficial via Object.clone()
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

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

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

        // Cópia superficial
        Person copiedPerson = (Person) originalPerson.clone();

        System.out.println("Pessoa original: " + originalPerson);
        System.out.println("Pessoa copiada: " + copiedPerson);

        // Alterar o campo mutável no objeto aninhado do original...
        originalAddress.city = "Los Angeles";

        // ...as alterações também são visíveis na cópia, pois ambas referenciam o mesmo objeto Address
        System.out.println("\nApós modificar o endereço original:");
        System.out.println("Pessoa original: " + originalPerson);
        System.out.println("Pessoa copiada: " + copiedPerson);
    }
}

Aplicado quando não há necessidade de duplicar toda a hierarquia de objetos, ou quando os objetos aninhados são imutáveis.