— Salom, Amigo!
— Salom, Billaabo!
— Bugun Billaabo sizga mutable va immutable ob'ektlar haqida gapiradi.
Yaratilgandan keyin o'zgartirilishi mumkin bo'lgan ob'ektlar o'zgaruvchan yoki mutable deb ataladi.
Yaratilgandan keyin o'zgartirilishi mumkin bo'lmagan ob'ektlar o'zgarmas yoki immutable deb ataladi.
— Ob'ektni o'zgartirish mumkinligi nimaga bog'liq?
— Yangi klass yozayotgan odam bu klassning ob'ektlarini o'zgarmas qilishi mumkin. Masalan, barcha setter'larni yashirish — ob'ektda faqat konstruktori va getter'lari bo'ladi, demak ob'ekt yaratib bo'lgandan so'ng uni o'zgartirish mumkin bo'lmaydi.
— Bu qanday yordam beradi?
— O'zgarmas ob'ektlarda juda ko'p foydali xususiyatlar mavjud. Lekin deyarli barcha immutable-ob'ektlarga xos ikki xususiyat mavjud:
1) O'zgarmas ob'ektlarni o'zgartiriladiganlarga qaraganda ancha oddiyroq amalga oshirish mumkin.
2) O'zgarmas ob'ektlarni bir vaqtning o'zida turli oqimlardan foydalanish mumkin.
Ko'pincha, dasturchi immutable klassi yozishga qaror qilganda, u bu klassning ikkita versiyasini yaratadi — mutable va immutable.
— Bitta klass o'rniga ikki klass yozishning ma'nosi nimada?
— Ba'zida bu foydaliroq bo'ladi, qachonki o'zgarmas versiyasi o'zgaruvchanidan ancha oddiyroq/tezroq bo'ladi. Shunda ikkita versiya qilishadi. Bu deyarli ArrayList va LinkedListga o'xshaydi: ikkalasi ham ro'yxatlar, lekin biri bir maqsadlar uchun optimizatsiyalangan bo'lsa, ikkinchisi — boshqa maqsadlar uchun.
— Endi tushunarliroq.
— Faqat o'zgarmas klasslar ham bo'lishi mumkin, ularsiz mutable versiyalari mavjud emas.
— Agar menga bunday ob'ektda nimadir o'zgartirish kerak bo'lsa-chi? O'zgarmas ob'ekt bilan umuman nima qilish mumkin?
— Odatda immutable klasslar turli xil metodlar mavjud bo'lib, ular ob'ektni "go'yo" o'zgartiradi, lekin aslida bu metodlar yangi ob'ekt yaratadi va uni qaytarishadi.
Sizga bir nechta misol keltiraman:
| Java kod | Tavsif |
|---|---|
|
Natijada s "moscow" satrini, s2 esa "MOSCOW" ni o'z ichiga oladi |
|
Mana, aslida nima sodir bo'ladi: Integer i = new Integer(1); Integer j = i; j = new Integer(i.getInt()+1); |
String klassi bu immutable klass. String turidagi barcha ob'ektlar o'zgarmas, lekin bu bizga ular bilan ishlashga halaqit bermaydi. Masalan, String klassining toUpperCase() metodi satrni katta harflarga o'zgartiradi (barcha kichik harflarni katta harflar bilan almashtiradi). Lekin bu metod asl satrni o'zgartirmaydi, balki yangi satrni qaytaradi, bu birinchi satrga identik, faqat barcha belgilari katta harflarda (katta).
Integer klassi ham bu immutable klass. Integer turidagi barcha ob'ektlar o'zgarmas. Har safar biz Integer ob'ektini o'zgartirganimizda, aslida yangi ob'ekt yaratiladi.
— Qanday qiziq. Ura, Billaabo.
— Ura menga, ura Billaabo!
GO TO FULL VERSION