Класс әдісін модификатормен белгілеу арқылы
final
біз ешбір туынды класс оның ішкі орындалуын өзгерту арқылы бұл әдісті қайта анықтай алмайтынын білдіреміз. Басқаша айтқанда, біз әдістің соңғы нұсқасы туралы айтып отырмыз. Жалпы сынып ретінде де белгілеуге болады final
.
final class NoExtending {
// …
}
Белгіленген сынып final
мұраланбайды және оның барлық әдістері сипатты жанама түрде алады final
. Сыныптар мен әдістердің мәлімдемелеріндегі мүмкіндікті пайдалану final
code қауіпсіздігінің деңгейін жоғарылатуы мүмкін. Егер сынып модификаторымен жабдықталған болса final
, ешкім сыныпты ұзарта алмайды және процесте оның келісімшартын бұзуы мүмкін. Егер белгі final
әдісті білдірсе, сіз «жалған жасаудан» қорықпай барлық жағдайларда оның ішкі орындалуына толық сене аласыз. final
Мысалы, әдіс декларациясында қолданушы енгізген құпия сөзді тексеруді талап ететін әдіс бастапқыда нені көздегенін дәл орындауды қамтамасыз ету үшін пайдалану орынды . Ықтимал шабуылдаушы мұндай әдістің бастапқы іске асырылуын бағдарламаға оның қайта анықталған нұсқасын «сығу» арқылы өзгерте алмайды, ол, айталық, қандай құпия сөзге қарамастан, пайдаланушының сәтті тіркелгенін көрсететін әрқашан шын мәнін қайтарады. ол шынымен кірді. final
Сіз, егер нақты жағдай мүмкіндік берсе, одан әрі өтуге және бүкіл сыныпты сынып деп жариялауға құқығыңыз бар ; әдіс ValidatePassword
жанама түрде бірдей қасиетке ие болады. Әдісте немесе класс декларациясында модификаторды пайдалану final
codeты одан әрі пайдалану және дамыту мүмкіндігіне елеулі шектеулер қояды. Декларацияда әдісті пайдалану final
әдісті іске асыру өздігінен және толық аяқталғандығының сенімді көрсеткіші болып табылады. Сіздің сыныпты пайдаланғысы келетін, оның функцияларын өз қажеттіліктеріне сай кеңейтетін басқа бағдарламашылар өз мақсаттарына жету құралдарын таңдауда шектеледі немесе олардан толығымен айырылады. Сыныпты тұтастай белгілеу арқылы final
оның мұрагерлік қабілетін өшіресіз және оның басқалар үшін пайдалылығын айтарлықтай төмендетуі мүмкін. Модификаторды пайдаланғалы жатқанда final
, СІЗДІҢ мұндай құрбандықтарға дайын екеніңізді және оларды жасауға тұрарлық па екенін тексеріңіз. Көптеген жағдайларда code қауіпсіздігінің жеткілікті деңгейіне жету үшін бүкіл классты келесідей белгілеудің қажеті жоқ - модификатормен оның тек «критикалық» құрылымдық элементтерін final
белгілеу арқылы сыныптың кеңеюін сақтауға әбден болады . final
Бұл жағдайда сіз сыныптың негізгі функцияларын өзгеріссіз қалдырасыз және сонымен бірге жаңа мүшелерді қосу арқылы оның мұрагерлігіне рұқсат бересіз, бірақ «ескілерді» қайта анықтамайсыз. Әрине, әдістердің codeы арқылы қол жеткізілетін өрістер өз кезегінде немесе final
ретінде белгіленуі керек , өйткені әйтпесе кез келген туынды класс сәйкес әдістердің әрекетіне әсер ете отырып, олардың мазмұнын өзгерте алады. Модификаторды қолданудың тағы бір әсері компилятор шешетін codeты оңтайландыру мәселесін жеңілдетуге байланысты. Белгіленбеген әдіс шақырылған кезде осылай боладыfinal
private
final
final
, орындалу уақыты жүйесі нысанның нақты сыныбын анықтайды, шақыруды шамадан тыс жүктелген әдістер тобынан ең сәйкес codeпен байланыстырады және басқаруды сол codeқа тасымалдайды. Бірақ, мысалы, бұрын талқыланған getName
сынып мысалындағы әдіс Attr
ретінде тағайындалған болса final
, оны шақыру әрекеті айтарлықтай жеңілдетілген болуы мүмкін. Ең тривиальды жағдайда, мысалы -ға қатысты getName
, компилятор әдіс шақыруын өзінің негізгі codeымен жай ғана ауыстыра алады. Бұл механизм codeты енгізу деп аталады. Әдістің кірістірілген нұсқасын пайдаланған кезде getName
келесі екі өрнек бірдей орындалады:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
Жоғарыда келтірілген өрнектер баламалы болғанымен, екіншісінің артықшылығы бар, өйткені әдіс getName
атау өрісіне тек оқуға арналған сипат беруге мүмкіндік береді, ал класс codeы абстракцияның белгілі бір дәрежесіне ие болады, бұл сізге еркін өзгертуге мүмкіндік береді. сыныпты жүзеге асыру. Бірдей оңтайландыру схемасын компилятор private
және әдістеріне қолдана алады statiс
, өйткені олар да қайта анықтауға мүмкіндік бермейді. Класс мәлімдемелерінде модификаторды пайдалану final
кейбір типті тексеру әрекеттерін тиімдірек етеді. Бұл жағдайда көптеген мұндай операцияларды құрастыру сатысында орындауға болады, сондықтан ықтимал қателер әлдеқайда ертерек анықталады. Егер компилятор бастапқы мәтіндегі сыныпқа сілтемені кездестірсе final
, сәйкес нысанның көрсетілген типте екеніне "сенімді" болуы мүмкін. Компилятор класстың жалпы иерархиядағы орнын бірден анықтай алады және оның дұрыс пайдаланылғанын немесе қолданылмағанын тексере алады. Егер модификатор final
қолданбаса, сәйкес тексерулер тек бағдарламаның орындалу сатысында жүргізіледі. 3.4- жаттығу . Соңғы модификаторды көлік құралдары мен жолаушылар көлігі сыныптарының әдіс декларацияларына (және солай болса, қайсысы) қосу орынды ма ? Бастапқы дереккөзге сілтеме: http://src-code.net/metody-i-klassy-final-java
GO TO FULL VERSION