Sobes.tech
Middle
213

O que é necessário fazer para criar uma classe imutável em Java?

Resposta da IA

sobes.tech IA

  • Declare uma classe com o modificador final para evitar herança.
  • Declare todos os campos da classe com o modificador final.
  • Declare todos os campos da classe com o modificador private para evitar acesso direto.
  • Não forneça setters para os campos.
  • Se a classe contiver objetos mutáveis (por exemplo, ArrayList), então:
    • No construtor, copie os objetos mutáveis de entrada em vez de atribuir referências.
    • Nos getters, retorne cópias dos objetos mutáveis em vez dos próprios objetos.

Exemplo:

// A classe Person é imutável
public final class Person {

    private final String name;
    private final int age;
    private final List<String> tags; // Campo mutável

    // O construtor faz uma cópia profunda dos campos mutáveis
    public Person(String name, int age, List<String> tags) {
        this.name = name;
        this.age = age;
        // Copia a lista ao criar o objeto
        this.tags = new ArrayList<>(tags);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // Retorna uma cópia da lista para evitar sua modificação externa
    public List<String> getTags() {
        return new ArrayList<>(tags);
    }

    // Sobrescreve os métodos equals e hashCode se necessário
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name) &&
               Objects.equals(tags, person.tags);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, tags);
    }
}