Sobes.tech
Junior

Czym są obiekty niemutowalne (immutable)?

sobes.tech AI

Odpowiedź od AI

Obiekty, których stan nie może być zmieniony po utworzeniu. Przy próbie modyfikacji zawsze tworzony jest nowy obiekt.

Przykłady niezmiennych klas w Java:

  • String
  • Opakowania prymitywne (Integer, Long, Boolean itd.)
  • Niektóre kolekcje (Collections.unmodifiableList(), ImmutableList z Guava)

Zalety:

  • Bezpieczeństwo wątków (nie wymagają synchronizacji przy współdzielonym dostępie).
  • Łatwość użycia (stan obiektu jest łatwy do zrozumienia).
  • Mogą być używane jako klucze w HashMap lub elementy Set (ich hashCode i equals() nie zmieniają się).
  • Poprawiają wydajność dzięki możliwości cache'owania i ponownego użycia.

Wady:

  • Tworzenie nowego obiektu przy każdej modyfikacji może być nieefektywne przy częstych zmianach.

Tworzenie własne:

  • Zadeklarować klasę jako final.
  • Zadeklarować wszystkie pola jako prywatne i final.
  • Nie udostępniać metod-setterów.
  • W getterach dla pól mutowalnych zwracać kopie, a nie odwołania do oryginalnych obiektów.
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;
        // Tworzymy kopię, aby uniknąć zmian z zewnątrz
        this.hobbies = new ArrayList<>(hobbies);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public List<String> getHobbies() {
        // Zwracamy niezmienną listę
        return Collections.unmodifiableList(hobbies);
    }
}