В: Като се има предвид, че:
private
методи не могат да бъдат заменени от подкласовеfinal
методи не могат да бъдат заменени от подкласовеfinal
методите позволяват по-бърз код, когато се компилира с оптимизации на(javac -O)
Въпросите ми са:
- Защо да не декларираме и всички
private
методиfinal
? - Повечето компилатори третират ли
private
методите катоfinal
?
О: Както посочвате, подкласовете може да не заменят private
методите по дизайн. Освен това final
ключовата дума казва на компилатора, че подкласовете може да не заменят метод, независимо от нивото на достъп. Тъй като private
вече предполага, че подкласът може да не замени метод, обявяването на private
метод за final
е излишно. Извършването на декларацията няма да създаде проблеми, но и няма да постигне нищо, тъй като private
s се разглеждат автоматично final
.
Е, практиката на деклариране на всички private
методи final
ще има един страничен ефект. Всеки начинаещ Java програмист, който се сблъска с вашия код, ще усвои вашето използване на private final
, мислейки, че private
s трябва да бъде деклариран по този начин. Така че ще можете да прецените кой е и кой не е бил в контакт с вашия код. Може да се окаже интересно упражнение.
Така че, за да отговорите на въпрос 1, няма нужда да декларирате private
членове final
.
Що се отнася до въпрос 2, оптимизиращият компилатор и JVM могат да се възползват от private
методите и final
методите. Тъй като подкласовете може да не заменят тези типове, няма нужда да правите динамично свързване по време на изпълнение. Подкласовете никога няма да отменят метода, така че времето за изпълнение винаги ще знае какъв метод да извика, без да търси йерархията на наследството. По време на компилацията оптимизиращият компилатор може дори да избере да вгради всички private
и final
методи за подобряване на производителността.
Така че, за да отговорят на въпрос 2, да, всички компилатори ще третират private
методите като final
. Компилаторът няма да позволи private
да бъде заменен нито един метод. По същия начин всички компилатори ще попречат на подкласовете да отменят final
методите.
По-интересен въпрос: Всички ли компилатори ще оптимизират final
s и private
s, така че да са вградени? Краткият отговор е отрицателен. Поведението на оптимизацията ще зависи от компилатора и неговите настройки.
Забележка: Обсъждането на частния финал се отнася само за методи. Частните променливи на крайния член се третират по различен начин
Научете повече за тази тема
- Искам още? Вижте Индекса за въпроси и отговори на Java за пълния каталог с въпроси и отговори
//www.javaworld.com/javaworld/javaqa/javaqa-index.html
Тази история, "Частна и последна?" е първоначално публикуван от JavaWorld.