Оголошення методів і класів з ключовим словом final

Якщо метод оголошений з атрибутом final, це означає, що жоден розширений клас зможе перевизначити даний метод з метою змінити його поведінку Іншими словами, дана версія методу є остаточної

Подібним чином можуть оголошуватися цілі класи:

final class NoExtending {

// ..

}

Клас, позначений з атрибутом final, не може бути субклассірован, а всі його методи також неявно є final

Є два основних доводи на користь оголошення методів з атрибутом final Перший з них – безпека кожен, хто користується класом, може бути впевнений, що його поведінка залишиться незмінним, незалежно від обєктів, з якими йому доводиться працювати

Остаточні класи та методи підвищують безпеку Якщо клас є остаточним, то ви не зможете оголосити розширює її клас і, отже, не зможете порушити його контракт Якщо ж остаточним є метод, ви можете покластися на його реалізацію (зрозуміло, лише в тому випадку, якщо в ньому не викликаються не остаточні методи) Наприклад, final може використовуватися для методу перевірки введеного пароля validatePassword, щоб цей метод завжди виконував свої

функції і не був перевизначений з тим, щоб за всіх обставин повертати true Крім того, можна помітити з атрибутом final цілий клас, що містить цей метод, щоб заборонити його розширення і уникнути можливих проблем, повязаних з реалізацією validatePassword

У багатьох випадках рівень безпеки класу, оголошеного final, може бути досягнутий за рахунок того, що клас залишається розширюваним, а кожен з його методів оголошується final У цьому випадку можна бути впевненим у роботі даних методів і при цьому залишити можливість розширення за допомогою додавання нових функцій без перевизначення існуючих методів Зрозуміло, поля, на які спираються методи final, повинні бути оголошені private, інакше розширений клас зможе все зіпсувати за рахунок модифікації цих полів

Клас або метод, позначений final, серйозно обмежує використання даного класу Якщо метод оголошується final, то ви повинні бути дійсно впевнені в тому, що його поведінка ні за яких обставин не повинно змінитися Ви обмежуєте гнучкість класу, ускладнюючи життя іншим розробникам, які захочуть

скористатися вашим класом для підвищення функціональності своїх програм Якщо клас позначений final, то ніхто не зможе розширити його, отже, його корисність обмежується Оголошуючи небудь з ключовим словом final, переконайтеся в тому, що випливають з цього обмеження дійсно необхідні

Проте використання final спрощує оптимізацію програми При виклику методу, який не є final, runtime-система Java визначає фактичний тип обєкта, повязує виклик з потрібною реалізацією методу для даного типу і потім викликає дану реалізацію Але якби, скажімо, метод nameOf в класі Attr був оголошений як final і у вас була посилання на обєкт типу Attr або будь-якого похідного від нього типу, то при виклику методу можна обійтися і без усіх цих дій У простому випадку (такому, як nameOf) виклик методу в програмі можна замінити тілом методу Такий механізм

відомий під назвою вбудованих методів (inlining) Вбудований метод призводить до того, що наступні два оператора стають еквівалентними:

Systemoutprintln(“id = ” + rosename) Systemoutprintln(“id = ” + rosenameOf())

Хоча ці два оператора призводять до одного результату, застосування методу nameOf дозволяє зробити поле name доступним тільки для читання і надає у ваше розпорядження всі переваги абстрагування, дозволяючи в будь-який момент змінити реалізацію методу

По відношенню до розглянутій оптимізації методи private і static еквівалентні методам final, оскільки вони також не можуть бути перевизначені

Деякі перевірки для класів final здійснюються швидше По суті, багато з них виробляються на стадії компіляції крім того, помилки виявляються швидше Якщо компілятор Java має справу з посиланням на клас виду final, він точно знає тип обєкта, на який вона вказує Для таких класів відома вся ієрархія, так що компілятор може перевірити, чи все з ними в порядку Для посилань на обєкти, що не які є final, багато перевірки здійснюються лише під час виконання програми

Вправа 34

Які з методів класів Vehicle і PassengerVehicle має сенс зробити final (якщо такі є)

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*