Sobes.tech
Middle

Kodėl nekeičiama būklė yra tokia svarbi programavime?

sobes.tech AI

Atsakymas iš AI

Neįmanomumas užtikrina keletą pranašumų:

  • Saugumas daugiagijose aplinkose: Neįmanomi objektai gali būti saugiai dalijami tarp srautų be sinchronizacijos ar užraktų, tai palengvina daugiagijų programų kūrimą ir užkerta kelią duomenų lenktynėms.
  • Numatymas: Neįmanomo objekto būsena niekada nesikeičia po sukūrimo. Tai palengvina duomenų srauto supratimą ir klaidų taisymą, nes tiksliai žinote, kad objektas nepasikeis netikėtai.
  • Talpyklavimas ir memoizacija: Neįmanomi objektai lengvai talpinami į talpyklą. Jei du objektai yra lygūs (equals), jų maišos kodai visada bus vienodi (jei hashCode yra teisingai įgyvendintas), ir jų būsena nesikeis, tai leidžia saugiai pakartotinai naudoti apskaičiuotus rezultatus.
  • Dizaino supaprastinimas: Darbas su neįmanomais objektais gali padėti sukurti modulinesnį ir aiškesnį kodą. Funkcijos, priimančios ir grąžinančios neįmanomus objektus, yra švarios ir neturi šalutinių efektų.
  • Naudingo našumo pagerinimas kai kuriais atvejais: Nors naujo objekto kūrimas kiekvienai pakeitimui gali atrodyti neefektyvus, JVM šiukšlių surinkėjas yra optimizuotas dirbti su daugybe trumpalaikių objektų, ir užraktų nebuvimas daugiagijose aplinkose gali kompensuoti išlaidas.

Pavyzdys, kaip sukurti neįmanomą klasę:

public final class ImmutableClass {

    private final int value;
    private final String name;

    public ImmutableClass(int value, String name) {
        this.value = value;
        this.name = name;
    }

    public int getValue() {
        return value;
    }

    public String getName() {
        return name;
    }

    // Nėra setterių
    // Fildai final
    // Klasė final
    // Visi laukai yra primityvūs arba kiti neįmanomi objektai,
    // arba grąžinami kopijos keičiamiems objektams, jei reikia (čia nėra)

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ImmutableClass that = (ImmutableClass) o;
        if (value != that.value) return false;
        return name != null ? name.equals(that.name) : that.name == null;
    }

    @Override
    public int hashCode() {
        int result = value;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}