Частно и окончателно?

В: Като се има предвид, че:

  • private методи не могат да бъдат заменени от подкласове
  • final методи не могат да бъдат заменени от подкласове
  • final методите позволяват по-бърз код, когато се компилира с оптимизации на (javac -O)

Въпросите ми са:

  1. Защо да не декларираме и всички privateметоди final?
  2. Повечето компилатори третират ли privateметодите като final?

О: Както посочвате, подкласовете може да не заменят privateметодите по дизайн. Освен това finalключовата дума казва на компилатора, че подкласовете може да не заменят метод, независимо от нивото на достъп. Тъй като privateвече предполага, че подкласът може да не замени метод, обявяването на privateметод за finalе излишно. Извършването на декларацията няма да създаде проблеми, но и няма да постигне нищо, тъй като privates се разглеждат автоматично final.

Е, практиката на деклариране на всички privateметоди finalще има един страничен ефект. Всеки начинаещ Java програмист, който се сблъска с вашия код, ще усвои вашето използване на private final, мислейки, че privates трябва да бъде деклариран по този начин. Така че ще можете да прецените кой е и кой не е бил в контакт с вашия код. Може да се окаже интересно упражнение.

Така че, за да отговорите на въпрос 1, няма нужда да декларирате privateчленове final.

Що се отнася до въпрос 2, оптимизиращият компилатор и JVM могат да се възползват от privateметодите и finalметодите. Тъй като подкласовете може да не заменят тези типове, няма нужда да правите динамично свързване по време на изпълнение. Подкласовете никога няма да отменят метода, така че времето за изпълнение винаги ще знае какъв метод да извика, без да търси йерархията на наследството. По време на компилацията оптимизиращият компилатор може дори да избере да вгради всички privateи finalметоди за подобряване на производителността.

Така че, за да отговорят на въпрос 2, да, всички компилатори ще третират privateметодите като final. Компилаторът няма да позволи privateда бъде заменен нито един метод. По същия начин всички компилатори ще попречат на подкласовете да отменят finalметодите.

По-интересен въпрос: Всички ли компилатори ще оптимизират finals и privates, така че да са вградени? Краткият отговор е отрицателен. Поведението на оптимизацията ще зависи от компилатора и неговите настройки.

Забележка: Обсъждането на частния финал се отнася само за методи. Частните променливи на крайния член се третират по различен начин

Научете повече за тази тема

  • Искам още? Вижте Индекса за въпроси и отговори на Java за пълния каталог с въпроси и отговори

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

Тази история, "Частна и последна?" е първоначално публикуван от JavaWorld.