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 (jeihashCodeyra 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;
}
}