JavaRush /Java блог /Random UA /Методи та класи final Java
articles
15 рівень

Методи та класи final Java

Стаття з групи Random UA
Позначаючи метод класу модифікатором final, ми маємо на увазі, що жоден похідний клас неспроможна перевизначити цей метод, змінивши його внутрішню реалізацію. Іншими словами, йдеться про фінальну версію методу. Клас загалом також може бути позначений як final. Методи та класи final Java - 1
final class NoExtending {
// …
}
Клас, позначений як final, не піддається успадкування і всі його методи опосередковано набувають властивість final. Застосування ознака finalв оголошеннях класів і методів здатне підвищити рівень безпеки коду. Якщо клас має модифікатор final, ніхто не в стані розширити клас і, ймовірно, порушити при цьому його контракт. Якщо ознакою finalпозначено метод, ви можете повністю довіряти його внутрішній реалізації у всіх ситуаціях, не побоюючись "підробки". Доречно застосуватиfinalнаприклад, в оголошенні методу, що передбачає перевірку пароля, що вводиться користувачем, щоб гарантувати точне виконання того, що методом передбачено спочатку. Можливому зловмиснику не вдасться змінити вихідну реалізацію такого методу, "підсунувши" програмі його перевизначену версію, яка, скажімо, завжди повертає значення true, що свідчить про успішну реєстрацію користувача, незалежно від того, який пароль він запровадив насправді. Ви маєте право, якщо дозволяє конкретна ситуація, піти далі і оголосити як finalклас цілком; метод ValidatePasswordнабуде те саме властивість непрямим шляхом. Вживання модифікатора finalв оголошенні методу чи класу накладає серйозні обмеження можливість подальшого використання та розвитку коду. Застосуванняfinalв оголошенні методу - це правильний показник того, що реалізація методу самодостатня та повністю завершена. Інші програмісти, які захочуть користуватися вашим класом, розширивши його функції для своїх потреб, будуть обмежені у виборі засобів досягнення мети або повністю позбавлені таких. Помітивши ознакою finalклас загалом, ви забороните можливість його успадкування і, мабуть, суттєво знизите його практичну цінність іншим. Зібравшись застосувати модифікатор final, переконайтеся, чи готові ВИ до подібних жертв і чи варто їх принести. У багатьох випадках для досягнення достатнього рівня безпеки коду немає необхідності позначати весь клас як final– цілком можливо зберегти здатність класу до розширення, помітивши модифікаторомfinalлише його "критичні" структурні елементи. У цьому випадку ви залишите в недоторканності основні функції класу і одночасно дозволите його успадкування з додаванням нових членів, але без перевизначення "старих". Вочевидь, поля, яких звертається код методів final, повинні бути у свою чергу позначені як finalабо private, оскільки у іншому разі будь-який похідний клас отримає можливість змінювати їх вміст, впливаючи на поведінка відповідних методів. Ще один ефект застосування модифікатора finalпов'язаний зі спрощенням задачі оптимізації коду, що вирішується компілятором. Ось що відбувається, коли викликається метод, не помічений якfinal, виконуюча система визначає фактичний клас об'єкта, пов'язує виклик з найбільш відповідним кодом групи перевантажених методів і передає управління цьому коду. Але якби, наприклад, метод getNameу прикладі класу Attr, розглянутому раніше, був позначений як finalоперація звернення до нього, можливо, була б помітно спрощена. У самому тривіальному випадку, подібному до того, що стосується getName, компілятор може просто замінити виклик методу кодом його тіла. Такий механізм зветься вбудовування коду (inlining). При використанні inline-версії методу getNameдва наступні вирази виконуються абсолютно однаково:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
Хоча наведені висловлювання рівнозначні, друге все-таки має перевагу, оскільки метод getNameдозволяє надати полю name властивість "тільки для читання", а коду класу - певний ступінь абстракції, який забезпечує можливість більш вільної зміни реалізації класу. Та ж схема оптимізації може бути застосована компілятором і по відношенню до методів privateі statiс, так як вони не допускають перевизначення. Використання модифікатора finalв оголошеннях класів сприяє підвищенню ефективності деяких операцій перевірки типів. У цьому випадку багато таких операцій можуть бути виконані вже на стадії компіляції і тому потенційні помилки виявляються набагато раніше. Якщо компілятор зустрічає у вихідному тексті посилання на класfinal, може бути " впевнений " , що відповідний об'єкт належить саме до типу, який зазначений. Компілятор може відразу визначити місце, займане класом у спільній ієрархії класів, і перевірити, вірно той використовується чи ні. Якщо модифікатор finalне застосовується, відповідні перевірки здійснюються лише на стадії виконання програми. Вправа 3.4. Чи доцільно включити в оголошення методів (і якщо так, та яких саме) класів vehicle і passengervehicle модифікатор final ? Посилання на першоджерело: http://src-code.net/metody-i-klassy-final-java
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ