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