Sobes.tech
Junior

Co jsou neměnné objekty (immutable)?

sobes.tech AI

Odpověď od AI

Objekty, jejichž stav nelze po vytvoření změnit. Při pokusu o modifikaci je vždy vytvořen nový objekt.

Příklady neměnných tříd v Javě:

  • String
  • Primitivní obaly (Integer, Long, Boolean atd.)
  • Některé kolekce (Collections.unmodifiableList(), ImmutableList z Guava)

Výhody:

  • Bezpečnost vláken (nevyžadují synchronizaci při souběžném přístupu).
  • Jednoduchost použití (stav objektu je snadno pochopitelný).
  • Mohou být použity jako klíče v HashMap nebo prvky v Set (jejich hashCode a equals() se nemění).
  • Zlepšují výkon díky cachování a opětovnému použití.

Nevýhody:

  • Vytváření nového objektu při každé modifikaci může být neefektivní při častých změnách.

Vytvoření vlastního:

  • Deklarujte třídu jako final.
  • Deklarujte všechna pole jako soukromá a final.
  • Neposkytujte metody setter.
  • V gettere pro mutabilní pole vracejte kopie, nikoli odkazy na původní objekty.
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;
        // Vytvoření kopie, aby se zabránilo změnám zvenčí
        this.hobbies = new ArrayList<>(hobbies);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public List<String> getHobbies() {
        // Vracíme neměnitelný seznam
        return Collections.unmodifiableList(hobbies);
    }
}