Sobes.tech
Junior

Čo sú nemenné objekty (immutable)?

sobes.tech AI

Odpoveď od AI

Objekty, ktorých stav nie je možné zmeniť po ich vytvorení. Pri pokuse o modifikáciu sa vždy vytvorí nový objekt.

Príklady nemenných tried v Jave:

  • String
  • Primitívne obaly (Integer, Long, Boolean atď.)
  • Niektoré kolekcie (Collections.unmodifiableList(), ImmutableList z Guava)

Výhody:

  • Bezpečnosť vlákien (nevyžadujú synchronizáciu pri súbežnom prístupe).
  • Jednoduchosť použitia (stav objektu je ľahko pochopiteľný).
  • Môžu byť použité ako kľúče v HashMap alebo prvky v Set (ich hashCode a equals() sa nemenia).
  • Zlepšujú výkon pomocou cacheovania a opätovného použitia.

Nevýhody:

  • Vytváranie nového objektu pri každej zmene môže byť neefektívne pri častých zmenách.

Vlastné vytváranie:

  • Vyhláste triedu ako final.
  • Vyhláste všetky polia ako súkromné a final.
  • Neposkytujte metódy setter.
  • V getteroch pre mutovateľné polia vracajte kópie, nie 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;
        // Vytvárame kópiu, aby sme zabránili zmenám zvonku
        this.hobbies = new ArrayList<>(hobbies);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public List<String> getHobbies() {
        // Vrátime nemenný zoznam
        return Collections.unmodifiableList(hobbies);
    }
}