В цьому записі буде розглянуто значення ключових слів Java – final та finally, кожне з котрих має свою мету для використання.

final

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

final змінні

В Java, при оголошенні final змінної, її можна ініціалізувати лише один раз. Після того як final змінній присвоєно значення, спроба його змінити призведе до помилки компіляції:

package wiki.it.notes.core.keyword_final;

public class Main {

    final static int NUMBER = 5;

    public static void main(String[] args) {
        NUMBER = 10;
    }
}

Помилка:

java: cannot assign a value to final variable NUMBER

Ця властивість придає final змінним схожість з константами.

final методи

final методи в Java – це методи, котрі не можуть бути перевизначені в жодному підкласі. Це може бути корисним, коли потрібно підтримувати узгоджену реалізацію методу в ієрархії класів, таким чином уникаючи непередбаченої поведінки:

public class A {

    public final void message () {
        System.out.println("Ok");
    }
}
public class B extends A {

    @Override
    public void message() {
        System.out.println("Not Ok");
    }
}

В прикладі вище, спроба паревизначити final метод message, в класі спадкоємці, призведе до помилки:

java: message() in B cannot override message() in A overridden method is final

final класи

final клас в Java – це клас, котрий не може бути успадкований жодним іншим класом. Це застосовується для забезпечення незмінності поведінки класу, шляхом успадкування:

public final class A {
    // class code
}

public class B extends A {}

При спробі успадкувати final клас, буде отримано помилку компіляції:

java: cannot inherit from final A

Таке обмеження може бути корисним наприклад для класів, що містять критично важливу для безпеки логіку, котру не слід перевизначати.

finally

Блок finally в Java є частиною конструкції try-catch-finally, для обробки винятків. Блок finally гарантовано виконується, незалежно від того, було згенеровано виняток в блоці try, чи ні.

Використання finally корисне для звільнення ресурсів (наприклад закриття файлових потоків або з’єднань з базами даних), гарантуючи їх звільнення незалежно від результату операції. Це допомагає запобігти витокам пам’яті та неналежному використанню ресурсів.

Приклад блоку finally:

public class Main {

    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        try {
            System.out.println("1. Try block");
            System.out.println(a/b);
        } catch (Exception e) {
            System.out.println("2. Catch block");
        } finally {
            System.out.println("3. Finally block");
        }
    }
}

В прикладі вище я навмисно зімітував генерацію винятку ArithmeticException (виникає при діленні на 0). Як можна помітити з результату, після створення винятку в блоці try, було виконано блок catch (обробка помилки), а в завершення блок finally:

1. Try block
2. Catch block
3. Finally block 

Висновок

final та finally – це ключові слова в Java, котрі мають різне призначення:

  • final – використовується для оголошення констант, запобігання перевизначенню методів та успадкуванню класів.
  • finally – блок, котрий використовується в конструкції обробки винятків try-catch-finally, для виконання коду незалежно від генерації винятку.

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


Мітки: