Sobes.tech
Junior

Какво са неизменяемите обекти (immutable)?

sobes.tech AI

Отговор от AI

Обекти, чието състояние не може да бъде променено след създаването им. При опит за модификация винаги се създава нов обект.

Примери за неизменяеми класове в Java:

  • String
  • Примитивни обвивки (Integer, Long, Boolean и др.)
  • Някои колекции (Collections.unmodifiableList(), ImmutableList от Guava)

Предимства:

  • Безопасност при работа с нишки (не изискват синхронизация при съвместен достъп).
  • Лесна употреба (лесно е да се разбере състоянието на обекта).
  • Могат да се използват като ключове в HashMap или елементи в Set (техният hashCode и equals() не се променят).
  • Подобряват производителността чрез кеширане и повторна употреба.

Недостатъци:

  • Създаването на нов обект при всяка модификация може да бъде неефективно при чести промени.

Създаване на свои:

  • Обявете класа като final.
  • Обявете всички полета като частни и final.
  • Не предоставяйте методи за сетване.
  • В геттърите за мутабелни полета връщайте копия, а не препратки към оригиналните обекти.
public final class ImmutablePerson {
    private final String name;
    private final int age;
    private final List<String> hobbies;

    public ImmutablePerson(String name, int age, List<String> hobbies) {
        this.name = name;
        this.age = age;
        // Създаваме копие, за да избегнем външни промени
        this.hobbies = new ArrayList<>(hobbies);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public List<String> getHobbies() {
        // Връщаме неизменяем списък
        return Collections.unmodifiableList(hobbies);
    }
}