Бо ишора кардани усули синф бо тағирдиҳанда
final
, мо дар назар дорем, ки ҳеҷ як синфи ҳосилшуда наметавонад ин усулро тавассути тағир додани татбиқи дохorи он бекор кунад. Ба ибораи дигар, сухан дар бораи варианти ниҳоии усул меравад. Синфро дар маҷмӯъ метавон ҳамчун final
.
final class NoExtending {
// …
}
Синф, ки ҳамчун final
мерос гирифта намешавад ва ҳамаи усулҳои он ғайримустақим амволро ба даст меоранд final
. Истифодаи хусусият final
дар эъломияҳои синфҳо ва усулҳо метавонад сатҳи амнияти codeро баланд бардорад. Агар синф бо тағирдиҳанда муҷаҳҳаз бошад final
, ҳеҷ кас наметавонад синфро дароз кунад ва эҳтимол дар ин раванд шартномаи онро вайрон кунад. Агар аломате final
усулро ифода кунад, шумо метавонед ба татбиқи дохorи он дар ҳама ҳолатҳо бе тарси "сохтакорӣ" бовар кунед. final
Масалан, ҳангоми эъломияи усуле истифода бурдан мувофиқ аст , ки тафтиши пароли воридкардаи корбарро талаб мекунад, то иҷрои дақиқи он чизеро, ки усул дар ибтидо пешбинӣ кардааст, таъмин кунад. Ҳамлагари эҳтимолӣ наметавонад татбиқи аслии чунин усулро бо роҳи "лағждан" ба барнома versionи бекоркардаи онро тағир диҳад, ки гӯем, ҳамеша арзиши ҳақиқиро бармегардонад, ки бақайдгирии бомуваффақияти корбарро новобаста аз кадом парол нишон медиҳад. воқеан ворид шуд. Шумо ҳақ доред, ки агар вазъияти мушаххас имкон диҳад, минбаъд равед ва final
тамоми синфро ҳамчун синф эълон кунед; усул ValidatePassword
бавосита ҳамон моликиятро ба даст меорад. Истифодаи тағирдиҳанда final
дар декларатсияи метод ё синф ба имкони истифодаи минбаъда ва таҳияи code маҳдудиятҳои ҷиддӣ мегузорад. Истифодаи final
усул дар эъломия нишондиҳандаи боэътимоди он аст, ки татбиқи усул мустақилона ва комилан пурра аст. Барномасозони дигар, ки мехоҳанд синфи шуморо истифода баранд, функсияҳои онро мувофиқи эҳтиёҷоти худ васеъ кунанд, дар интихоби воситаҳо барои расидан ба ҳадафи худ маҳдуд мешаванд ё аз онҳо комилан маҳрум хоҳанд шуд. Бо нишон додани final
синф дар маҷмӯъ, шумо қобorяти меросии онро ғайрифаъол мекунед ва эҳтимолан фоиданокии онро барои дигарон ба таври назаррас коҳиш медиҳед. Вақте ки шумо тағирдиҳандаро истифода карданӣ ҳастед final
, боварӣ ҳосил кунед, ки оё ШУМО барои чунин қурбониҳо омода ҳастед ва оё ин ба онҳо меарзад. Дар бисёр мавридҳо, барои ноил шудан ба сатҳи кофии амнияти code, шарт нест, ки тамоми синфро ҳамчун нишон диҳед - бо нишон додани танҳо унсурҳои сохтории "муҳим" -и онро бо тағирдиҳанда final
нигоҳ доштани васеъшавии синф комилан имконпазир аст . final
Дар ин ҳолат, шумо вазифаҳои асосии синфро бетағйир мегузоред ва ҳамзамон ба мероси он бо иловаи аъзои нав, вале бе аз нав муайян кардани "кӯҳна" иҷозат медиҳед. Албатта, майдонҳое, ки тавассути codeи усулҳо дастрас мешаванд, бояд дар навбати худ ҳамчун яке final
таъин карда шаванд , зеро дар акси ҳол ҳама гуна синфи ҳосилшуда метавонад мундариҷаи худро тағир диҳад, ки ба рафтори усулҳои мувофиқ таъсир мерасонад. Таъсири дигари истифодаи тағирдиҳанда бо содда кардани мушкилоти оптимизатсияи code, ки аз ҷониби компилятор ҳал шудааст, алоқаманд аст. Ин ҳамон чизест, ки вақте ки усуле, ки ҳамчун номидашуда қайд карда нашудааст, рӯй медиҳадfinal
private
final
final
, системаи вақти корӣ синфи воқеии an objectро муайян мекунад, зангро бо рамзи мувофиқтарин аз гурӯҳи усулҳои изофабор алоқаманд мекунад ва назоратро ба он code интиқол медиҳад. Аммо агар, масалан, усули getName
дар мисоли синфе, Attr
ки қаблан баррасӣ шуда буд final
, ҳамчун . Дар ҳолати хеле ночиз, ба монанди ҳолати марбут getName
, компилятор метавонад танҳо занги методро бо рамзи баданаш иваз кунад. Ин механизм дохилкунии code (inlining) номида мешавад. Ҳангоми истифодаи versionи дохorи усул, getName
ду ифодаи зерин комилан якхела иҷро карда мешаванд:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
Гарчанде ки ибораҳои дар боло овардашуда баробаранд, дуюмаш ҳам бартарӣ дорад, зеро ин усул getName
ба шумо имкон медиҳад, ки ба майдони ном хосияти танҳо барои хондан дода шавад ва codeи синф дараҷаи муайяни абстраксия дошта бошад, ки ба шумо имкон медиҳад озодонатар тағйир диҳед татбиқи синф. Ҳамин схемаи оптимизатсияро компилятор ба усулҳо private
ва усулҳо татбиқ кардан мумкин аст statiс
, зеро онҳо инчунин ба бекоркунӣ иҷозат намедиҳанд. Истифодаи тағирдиҳанда final
дар эъломияҳои синф инчунин баъзе амалиёти санҷиши намудҳоро самараноктар мекунад. Дар ин ҳолат, бисёре аз чунин амалиётҳоро аллакай дар марҳилаи тартиб додан мумкин аст ва бинобар ин, хатогиҳои эҳтимолӣ хеле пештар ошкор карда мешаванд. Агар компилятор бо истинод ба синф дар матни сарчашма дучор ояд final
, он метавонад "боварӣ" дошта бошад, ки an objectи мувофиқ аз навъи муайяншуда аст. Компилятор қодир аст фавран ҷои ишғолкардаи синфро дар иерархияи умумии синф муайян кунад ва дуруст истифода шавад ё на. Агар тағирдиҳанда final
истифода нашавад, санҷишҳои мувофиқ танҳо дар марҳилаи иҷрои барнома гузаронида мешаванд. Машқи 3.4. Оё тавсия дода мешавад, ки тағирдиҳандаи ниҳоиро ба эъломияҳои усул (ва агар ин тавр бошад, кадомашон) аз синфҳои нақлиёт ва мусофиркашонӣ дохил кунед ? Истинод ба манбаи аслӣ: http://src-code.net/metody-i-klassy-final-java
GO TO FULL VERSION