Sobes.tech
Middle
86
questionbank

Что нужно сделать для создания immutabled класса в Java?

Ответ от нейросети

sobes.tech AI

  • Объявить класс с модификатором final, чтобы предотвратить наследование.
  • Объявить все поля класса с модификатором final.
  • Объявить все поля класса с модификатором private, чтобы предотвратить прямой доступ.
  • Не предоставлять сеттеры для полей.
  • Если класс содержит мутабельные объекты (например, ArrayList), то:
    • В конструкторе копировать входящие мутабельные объекты вместо присваивания ссылок.
    • В геттерах возвращать копии мутабельных объектов вместо самих объектов.

Пример:

// Класс Person является immutable
public final class Person {

    private final String name;
    private final int age;
    private final List<String> tags; // Мутабельное поле

    // Конструктор глубоко копирует мутабельные поля
    public Person(String name, int age, List<String> tags) {
        this.name = name;
        this.age = age;
        // Копируем список при создании объекта
        this.tags = new ArrayList<>(tags);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // Возвращаем копию списка, чтобы предотвратить его изменение извне
    public List<String> getTags() {
        return new ArrayList<>(tags);
    }

    // Переопределение методов equals и hashCode при необходимости
    @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);
    }
}