Класс ыкмасын модификатор менен белгилөө менен
final
, биз эч бир туунду класс анын ички ишке ашырылышын өзгөртүү менен бул ыкманы жокко чыгара алbyte дегенди билдиребиз. Башкача айтканда, биз ыкманын акыркы versionсы жөнүндө сөз болуп жатат. Бүтүндөй класс катары да белгилесе болот final
.
final class NoExtending {
// …
}
деп белгиленген класс final
мураска алынbyte жана анын бардык ыкмалары кыйыр түрдө менчикке ээ болот final
. Класстардын жана методдордун декларацияларында функцияны колдонуу final
codeдун коопсуздугунун деңгээлин жогорулата алат. Эгерде класс модификатор менен жабдылган болсо final
, анда эч ким классты узарта алbyte жана процесстин жүрүшүндө анын келишимин бузушу мүмкүн. Эгерде белги final
бир ыкманы билдирсе, анда "жасалмачылыктан" коркпостон, бардык жагдайларда анын ички ишке ашырылышына толук ишене аласыз. final
Мисалы, колдонуучу киргизген сырсөздү текшерүүнү талап кылган ыкманы жарыялоодо колдонуу ылайыктуу , бул ыкма башында эмнени кааласа, ошонун так аткарылышын камсыз кылат. Мүмкүн болгон чабуулчу мындай ыкманын баштапкы ишке ашырылышын программага анын жокко чыгарылган versionсын "кирип" өзгөртө алbyte, ал, айталы, ар дайым чыныгы маанисин кайтарып берет, кандай сырсөзгө карабастан, колдонуучунун ийгorктүү катталганын көрсөтүп турат. ал чындап кирди. final
Эгер конкреттүү кырдаал мүмкүнчүлүк берсе, андан ары барууга жана бүт классты класс деп жарыялоого укугуңуз бар ; ыкма ValidatePassword
кыйыр түрдө ошол эле мүлккө ээ болот. Усулда же класс декларациясында модификаторду колдонуу final
codeду андан ары колдонуу жана өнүктүрүү мүмкүнчүлүгүнө олуттуу чектөөлөрдү киргизет. final
Декларацияда методду колдонуу методду ишке ашыруу өзүн-өзү камтыган жана толугу менен толук экендигинин ишенимдүү көрсөткүчү болуп саналат. Классыңызды колдонууну каалаган башка программисттер, анын функцияларын өз муктаждыктарына ылайык кеңейтип, өз максаттарына жетүү үчүн каражаттарды тандоодо чектелген же алардан толугу менен ажыратылат. Классты бүтүндөй белгилөө менен final
, анын тукум куучулук жөндөмдүүлүгүн өчүрөсүз жана анын башкаларга пайдалуулугун бир топ азайтасыз. Модификаторду колдонгону жатканыңызда final
, СИЗ мындай курмандыктарга даяр экениңизди жана аларды жасоого татыктуубу же жокпу, текшериңиз. Көпчүлүк учурларда codeдун коопсуздугунун жетиштүү деңгээлине жетүү үчүн бүт классты мындай деп белгилөөнүн кажети жок final
- класстын кеңейүү мүмкүнчүлүгүн final
модификатор менен анын "критикалык" структуралык элементтерин гана белгилөө менен сактап калуу толук мүмкүн. Бул учурда, сиз класстын негизги функцияларын сактап каласыз жана ошол эле учурда жаңы мүчөлөрдү кошуу менен анын мурастоосуна уруксат бересиз, бирок "эски" мүчөлөрүн кайра аныктабастан. Албетте, методдордун codeу менен кирүүчү талаалар өз кезегинде же final
деп белгилениши керек , анткени антпесе ар кандай туунду класс тиешелүү методдордун жүрүм-турумуна таасирин тийгизип, мазмунун өзгөртө алат. Модификаторду колдонуунун дагы бир эффектиси компилятор тарабынан чечилген codeду оптималдаштыруу маселесин жөнөкөйлөтүү менен байланышкан. Бул деп белгиленбеген ыкма чакырылганда эмне болотfinal
private
final
final
, иштөө убактысы системасы an objectтин чыныгы классын аныктайт, чалууну ашыкча жүктөлгөн ыкмалар тобунан эң ылайыктуу code менен байланыштырат жана башкарууну ошол codeго өткөрүп берет. Бирок, мисалы, мурда талкууланган getName
класс үлгүсүндөгү ыкма Attr
катары белгиленген болсо final
, аны чакыруу операциясы байкаларлык жөнөкөйлөштүрүлгөн болушу мүмкүн. Эң майда-чүйдөсүнө чейин, мисалы -га тиешелүү болгон учурда getName
, компилятор жөн гана методду чакырууну өзүнүн негизги codeу менен алмаштыра алат. Бул механизм codeду киргизүү деп аталат. Методдун саптык versionсын колдонууда, getName
төмөнкү эки туюнтма так бирдей аткарылат:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
Жогорудагы туюнтмалар эквиваленттүү болгону менен, экинчиси дагы эле артыкчылыкка ээ, анткени ыкма getName
аталыш талаасына окуу үчүн гана касиет берүүгө, ал эми класстын codeу абстракциянын белгилүү бир даражасына ээ болууга мүмкүндүк берет, бул сизге эркин өзгөртүүгө мүмкүндүк берет. классты ишке ашыруу. Ошол эле оптималдаштыруу схемасын компилятор private
жана методдоруна колдонсо болот statiс
, анткени алар да жокко чыгарууга жол бербейт. Класс декларацияларында модификаторду колдонуу final
кээ бир типти текшерүү операцияларын натыйжалуураак кылат. Бул учурда, мындай операциялардын көбү компиляция стадиясында аткарылышы мүмкүн, ошондуктан мүмкүн болуучу каталар алда канча эрте аныкталат. Эгерде компилятор баштапкы текстте класска шилтемеге туш болсо final
, ал тиешелүү an object көрсөтүлгөн типте экенине "ишенбеши мүмкүн". Компилятор класстын жалпы иерархиясында ээлеген ордун дароо аныктап, анын туура колдонулганын же колдонулбагандыгын текшере алат. Модификатор final
колдонулбаса, тиешелүү текшерүүлөр программаны аткаруу стадиясында гана жүргүзүлөт. Exercise 3.4. Автоунаа жана жүргүнчүлөрдү ташуучу унаа класстарынын метод декларацияларына акыркы модификаторду кошуу максатка ылайыктуубу (жана ошондой болсо, кайсынысы ? Түпнуска булакка шилтеме: http://src-code.net/metody-i-klassy-final-java
GO TO FULL VERSION