
— Ողջույն, Ամիգո!
— Ողջույն, Բիլաաբո:
— Այսօր Բիլաաբոն կպատմի քեզ mutable և immutable օբյեկտների մասին:
Օբյեկտները, որոնք ստեղծվելուց հետո հնարավոր է փոփոխել, կոչվում են փոփոխելի կամ mutable.
Օբյեկտները, որոնք ստեղծվելուց հետո հնարավոր չէ փոփոխել, կոչվում են անփոփոխելի կամ immutable.
— Իսկ ինչից է կախված, թե հնարավոր է փոխել օբյեկտը, թե չէ?
— Մարդը, ով գրում է նոր կլաս, կարող է այնպես անել, որ այս կլասի օբյեկտները լինեն անփոփոխ։ Օրինակ, հնարավոր է թաքցնել բոլոր setter-ները — օբյեկտը կունենա միայն կոնստրուկտոր և getter-ներ, ուստի ստեղծելուց հետո հնարավոր չի լինի այն փոխել։
— Եվ ինչու՞ է սա օգտակար:
— Անփոփոխելի օբյեկտները ունեն շատ օգտակար հատկություններ։ Սակայն կարելի է առանձնացնել երկու, որոնք հատուկ են գրեթե բոլոր immutable օբյեկտներին:
1) Անփոփոխելի օբյեկտները կարող են իրականացնել շատ ավելի հեշտ, քան փոփոխելի օբյեկտները:
2) Անփոփոխելի օբյեկտները կարելի է ազատորեն օգտագործել միաժամանակ տարբեր նիթերից:
Շատ հաճախ, երբ ծրագրավորողը որոշում է գրել immutable կլաս, նա անում է այս կլասի երկու տարբերակները՝ mutable և immutable:
— Իսկ ինչու մի կլասի փոխարեն գրել երկու՞ կլաս:
— Երբեմն ավելի շահավետ է, երբ անփոփոխելի տարբերակը շատ ավելի հեշտ/արագ կլինի, քան փոփոխելի: Այդ ժամանակ և անում են երկու տարբերակ: Սա գրեթե ինչպես ArrayList և LinkedList. երկուսն էլ — ցուցակներ են, բայց մեկը օպտիմիզացվել է որոշակի նպատակների համար, իսկ մյուսը՝ ուրիշների համար:
— Հիմա ավելի պարզ է:
— Կան նաև զուտ immutable կլասներ՝ առանց mutable տարբերակի:
— Իսկ եթե ինձ պետք է ինչ-որ բան փոխել այդ օբյեկտի մեջ? Ի՞նչ կարելի է անել անփոփոխելի օբյեկտի հետ:
— Հիմնականում immutable կլասները ունեն տարբեր մեթոդներ, որոնք «ինջպես թե» փոխում են օբյեկտը, բայց բացի ինջնելուց դրանք պարզապես ստեղծում են նոր օբյեկտ և վերադարձնում այն:
Ահա քեզ մի քանի օրինակ՝
Java կոդ | Նկարագիր |
---|---|
|
Արդյունքում s պարունակում է տեքստը «moscow», իսկ s2՝ «MOSCOW» |
|
Ահա թե ինչ է տեղի ունենում իրականում. Integer i = new Integer(1); Integer j = i; j = new Integer(i.getInt()+1); |
String կլասը — սա immutable կլաս է։ String տիպի բոլոր օբյեկտները — անփոփոխելի են, բայց դա մեզ չի խանգարում դրանք օգտագործել։ Օրինակ, toUpperCase() մեթոդը String կլասի փոփոխում է տողը մեծատառերով (փոխում է բոլոր փոքրատառերը մեծատառերով): Բայց այս մեթոդը չի փոխում ինքը տողը, այլ վերադարձնում է նոր տողը, որը նույնն է առաջինին, բայց բոլոր տառերը մեծատառերով (մեծ տառեր):
Integer կլասը նույնպես immutable կլաս է։ Integer տիպի բոլոր օբյեկտները — անփոփոխելի են։ Ամեն անգամ, երբ մենք փոխում ենք Integer օբյեկտը, իրականում ստեղծվում է նոր օբյեկտ:
— Ինչ հետաքրքիր է։ ՈՒրա, Բիլաաբո:
— ՈՒրա ինձ, ՈՒրա Բիլաաբո:
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ