Sinf usulini modifikator bilan belgilash orqali
final
biz hech bir hosila sinf bu usulni ichki amalga oshirishni o'zgartirib, bekor qila olmasligini nazarda tutamiz. Boshqacha qilib aytganda, biz usulning yakuniy versiyasi haqida gapiramiz. Sinfni butun sifatida belgilash ham mumkin final
.
final class NoExtending {
// …
}
Deb belgilangan sinf final
meros qilib olinmaydi va uning barcha usullari bilvosita mulkka ega bo'ladi final
. Sinflar va usullar deklaratsiyasida xususiyatdan foydalanish final
kod xavfsizligi darajasini oshirishi mumkin. Agar sinf modifikator bilan jihozlangan bo'lsa final
, hech kim sinfni kengaytira olmaydi va bu jarayonda uning shartnomasini buzishi mumkin. Agar belgi final
usulni bildirsa, siz barcha holatlarda "soxtakorlik" dan qo'rqmasdan uning ichki bajarilishiga to'liq ishonishingiz mumkin. final
Masalan, usulni e'lon qilishda foydalanuvchi tomonidan kiritilgan parolni tekshirishni talab qiladigan usul dastlab mo'ljallangan narsaning aniq bajarilishini ta'minlash uchun foydalanish o'rinlidir . Mumkin bo'lgan tajovuzkor dasturga uning bekor qilingan versiyasini "o'tkazish" orqali bunday usulning asl qo'llanilishini o'zgartira olmaydi, bu, aytaylik, har doim haqiqiy qiymatni qaytaradi, bu qanday paroldan qat'i nazar, foydalanuvchini muvaffaqiyatli ro'yxatdan o'tkazishni ko'rsatadi. u haqiqatan ham kirdi. Agar aniq vaziyat imkon bersa, siz oldinga borish va final
butun sinfni sinf sifatida e'lon qilish huquqiga egasiz; usul ValidatePassword
bilvosita bir xil mulkka ega bo'ladi. Usul yoki sinf deklaratsiyasida modifikatordan foydalanish final
koddan keyingi foydalanish va ishlab chiqish imkoniyatiga jiddiy cheklovlar qo'yadi. final
Deklaratsiyada usuldan foydalanish usulni amalga oshirish o'z-o'zidan va to'liq to'liq ekanligining ishonchli ko'rsatkichidir. Sizning sinfingizdan foydalanmoqchi bo'lgan, uning funktsiyalarini o'z ehtiyojlariga ko'ra kengaytirmoqchi bo'lgan boshqa dasturchilar o'z maqsadlariga erishish uchun vositalarni tanlashda cheklangan yoki ulardan butunlay mahrum bo'lishadi. final
Sinfni butun sifatida belgilash orqali siz uning meros qilib olish qobiliyatini o'chirib qo'yasiz va uning boshqalar uchun foydaliligini sezilarli darajada kamaytiradi. Modifikatordan foydalanmoqchi bo'lganingizda final
, SIZ bunday qurbonliklarga tayyormisiz va ularni qilishga arziydimi yoki yo'qligini tekshiring. Ko'pgina hollarda, kod xavfsizligining etarli darajasiga erishish uchun butun sinfni shunday belgilash shart emas - faqat uning "tanqidiy" strukturaviy elementlarini modifikator bilan final
belgilash orqali sinfning kengaytirilishini saqlab qolish juda mumkin . final
Bunday holda, siz sinfning asosiy funktsiyalarini buzilmagan holda qoldirasiz va shu bilan birga yangi a'zolar qo'shilishi bilan, lekin "eski"larini qayta belgilamasdan meros qilib olishga ruxsat berasiz. Albatta, usullarning kodi orqali kirish mumkin bo'lgan maydonlar o'z navbatida har biri final
sifatida belgilanishi kerak , chunki aks holda har qanday hosila sinf o'z mazmunini o'zgartirishi mumkin, bu tegishli usullarning xatti-harakatlariga ta'sir qiladi. Modifikatordan foydalanishning yana bir ta'siri kompilyator tomonidan hal qilingan kodni optimallashtirish muammosini soddalashtirish bilan bog'liq. Belgilanmagan usul chaqirilganda shunday bo'ladifinal
private
final
final
, ish vaqti tizimi ob'ektning haqiqiy sinfini aniqlaydi, qo'ng'iroqni ortiqcha yuklangan usullar guruhidan eng mos kod bilan bog'laydi va boshqaruvni shu kodga o'tkazadi. Ammo, masalan, yuqorida muhokama qilingan getName
sinf misolidagi usul Attr
sifatida belgilangan bo'lsa final
, uni chaqirish jarayoni sezilarli darajada soddalashtirilgan bo'lishi mumkin edi. Eng ahamiyatsiz holatda, masalan, ga tegishli bo'lsa getName
, kompilyator oddiygina usul chaqiruvini o'zining asosiy kodi bilan almashtirishi mumkin. Ushbu mexanizm kodni kiritish deb ataladi. Usulning inline versiyasidan foydalanganda getName
quyidagi ikkita ifoda aynan bir xil tarzda bajariladi:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
Yuqoridagi iboralar ekvivalent bo'lsa-da, ikkinchisi hamon afzalliklarga ega, chunki usul getName
nom maydoniga faqat o'qish uchun xususiyatni berishga imkon beradi va sinf kodi ma'lum darajada abstraktsiyaga ega bo'lib, bu sizga erkinroq o'zgartirish imkonini beradi. sinfni amalga oshirish. Xuddi shu optimallashtirish sxemasi kompilyator tomonidan private
va usullariga qo'llanilishi mumkin statiс
, chunki ular ham bekor qilishga ruxsat bermaydi. Sinf deklaratsiyasida modifikatordan foydalanish, final
shuningdek, ayrim turdagi tekshirish operatsiyalarini samaraliroq qiladi. Bunday holda, ko'plab bunday operatsiyalar kompilyatsiya bosqichida amalga oshirilishi mumkin va shuning uchun mumkin bo'lgan xatolar ancha oldin aniqlanadi. Agar kompilyator manba matnida sinfga havolaga duch kelsa final
, mos keladigan ob'ekt belgilangan turdagi ekanligiga "ishonch" berishi mumkin. Kompilyator sinfning umumiy ierarxiyadagi o'rnini darhol aniqlay oladi va undan to'g'ri foydalanilgan yoki yo'qligini tekshiradi. Agar modifikator final
qo'llanilmasa, tegishli tekshiruvlar faqat dasturni bajarish bosqichida amalga oshiriladi. 3.4- mashq . Yakuniy modifikatorni transport vositalari va yo'lovchilar sinflarining uslub deklaratsiyasiga (agar shunday bo'lsa, qaysilari) kiritish tavsiya etiladi ? Asl manbaga havola: http://src-code.net/metody-i-klassy-final-java
GO TO FULL VERSION