Sobes.tech
Junior

U kojim slučajevima se može primeniti modifikator final u Javi?

sobes.tech АИ

Одговор од АИ

Модификатор final у Јави може се применити на:

  1. Променљиве:

    • Локалне променљиве: Њихова вредност се једном додељује и након иницијализације не може бити промењена.
    • Поля класе: Вредност поља се додељује при декларацији или у конструктору и након тога не може бити промењена.
    • Параметри метода: Параметар унутар метода постаје константа; не може се поново доделити унутар тела метода.

    Коришћење final за променљиве обезбеђује:

    • Непроменљивост: Гаранција да вредност неће бити промењена.
    • Безбедност у нитима: final поља класе су аутоматски видљива свим нитима након завршетка конструктора без додатне синхронизације.
    • Оптимизације компајлера: Компајлер може извршити одређене оптимизације знајући да вредност неће бити промењена.
  2. Методе:

    • Метод проглашен као final не може бити преоптерећен у подкласе.
    • Ово је корисно за:
      • Превенцију нежељених промена понашања: Гарантује да ће логика метода остати непромењена.
      • Подстицање композиције: Подстиче коришћење композиције уместо наследства.
      • Могуће оптимизације компајлера: Компилатор може извршити инлајн проширење позива final метода.
  3. Класе:

    • Класа проглашена као final не може имати подкласе.
    • Примена final на класу се користи за:
      • Креирање неизменљивих (immutable) класа: На пример, класе-обвивки за примитивне типове (Integer, String).
      • Заштиту дизајна: Превенција ширења које може нарушити инваријанте класе.
      • Повећање безбедности: Гарантује да понашање класе не може бити измењено кроз креирање подкласа.
Примена Опис Предности
final поље Вредност се додељује једном (при декларацији или у конструктору). Непроменљивост, безбедност у нитима, оптимизације.
final параметар Вредност не може бити промењена унутар методе. Јасна сигнатура, гаранција непомичности вредности параметра.
final метода Не може бити преоптерећена у подкласе. Превенција промене понашања, подстицање композиције, оптимизације.
final класа Не може имати подкласе (немогуће наслеђивање). Непроменљива класа, заштита дизајна, повећана безбедност.

Примери:

public class Example {
    // final поље
    private final String name;

    // final примитивно поље
    private final int id;

    // final, али може бити референца на различите објекте типа List
    private final List<String> items;

    // Константа у време компилације
    public static final double PI = 3.14159;

    public Example(String name, int id) {
        this.name = name; // додељивање у final поље
        this.id = id; // додељивање у final поље
        this.items = new ArrayList<>(); // иницијализација final поља листе
    }

    // final метода
    public final void printDetails() {
        System.out.println("Name: " + name + ", ID: " + id);
    }

    // метода са final параметром
    public void addItem(final String item) {
        // item = "нов елемент"; // грешка при компилацији: Cannot assign a value to final variable 'item'
        items.add(item);
    }
}

// final класа
// public final class ImmutableClass {
//     private final int value;
//
//     public ImmutableClass(int value) {
//         this.value = value;
//     }
//
//     public int getValue() {
//         return value;
//     }
// }

// public class SubclassOfImmutable extends ImmutableClass { // Грешка при компилацији: Cannot inherit from final class
// }