Sobes.tech
Middle

Ինչու է մերժելիությունը ծրագրավորման մեջ այդքան կարևոր?

sobes.tech AI

Պատասխան AI-ից

Անփոփոխությունը ապահովում է մի շարք առավելություններ.

  • Անվտանգություն բազմատրեդային միջավայրում: Անփոփոխ օբյեկտները կարող են անվտանգորեն բաժանվել թրեդների միջև առանց սինխրոնիզացիայի կամ բլոկների անհրաժեշտության, ինչը հեշտացնում է բազմատրեդային ծրագրերի զարգացումը և կանխում տվյալների մրցակցությունները:
  • Նախատեսելիություն: Անփոփոխ օբյեկտի վիճակը երբեք չի փոխվում ստեղծելուց հետո: Սա հեշտացնում է ծրագրի տվյալների հոսքի հասկանալը և սխալների հայտնաբերում, քանի որ դուք հստակ գիտեք, որ օբյեկտը անակնկալ կերպով չի փոխվի:
  • Էներգիայի և հիշողության խնայողություն: Անփոփոխ օբյեկտները հեշտ է կեշավորել: Եթե երկու օբյեկտները հավասար են (equals), նրանց հեշ-կոդերը միշտ նույնն են (կամ պետք է լինեն, եթե hashCode-ը ճիշտ է իրականացված), և նրանց վիճակը չի փոխվի, ինչը թույլ է տալիս անվտանգ կրկնակի օգտագործել հաշվարկված արդյունքները:
  • Դիզայնի պարզեցում: Օգտագործելով անփոփոխ օբյեկտներ, կարող եք գրել ավելի մոդուլային և հստակ կոդ: Ֆունկցիաները, որոնք ընդունում և վերադարձնում են անփոփոխ օբյեկտներ, մաքուր են և չունեն կողմնակի ազդեցություններ:
  • Կատարողականության բարելավում որոշ դեպքերում: Թեև նոր օբյեկտի ստեղծումը յուրաքանչյուր փոփոխության դեպքում կարող է թվալ անարդյունավետ, JVM-ի գարշահավաքը օպտիմիզացված է աշխատելու մեծ քանակությամբ կարճաժամկետ օբյեկտների հետ, և բլոկավորումների բացակայությունը բազմատրեդային միջավայրում կարող է փոխհատուցել ծախսերը:

Նմուշ՝ անփոփոխ դասի ստեղծման:

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

    // Սեթերներ չկան
    // Ֆիլդեր final
    // Կլաս final
    // Բոլոր ֆիլդերը պրիմիտիվ կամ այլ անփոփոխ օբյեկտներ են,
    // կամ վերադառնում են փոփոխական օբյեկտների պատճենները անհրաժեշտության դեպքում (այստեղ ոչ)

    @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;
    }
}