Junior
U kojim slučajevima se može primeniti modifikator final u Javi?
sobes.tech АИ
Одговор од АИ
Модификатор final у Јави може се применити на:
-
Променљиве:
- Локалне променљиве: Њихова вредност се једном додељује и након иницијализације не може бити промењена.
- Поля класе: Вредност поља се додељује при декларацији или у конструктору и након тога не може бити промењена.
- Параметри метода: Параметар унутар метода постаје константа; не може се поново доделити унутар тела метода.
Коришћење
finalза променљиве обезбеђује:- Непроменљивост: Гаранција да вредност неће бити промењена.
- Безбедност у нитима:
finalпоља класе су аутоматски видљива свим нитима након завршетка конструктора без додатне синхронизације. - Оптимизације компајлера: Компајлер може извршити одређене оптимизације знајући да вредност неће бити промењена.
-
Методе:
- Метод проглашен као
finalне може бити преоптерећен у подкласе. - Ово је корисно за:
- Превенцију нежељених промена понашања: Гарантује да ће логика метода остати непромењена.
- Подстицање композиције: Подстиче коришћење композиције уместо наследства.
- Могуће оптимизације компајлера: Компилатор може извршити инлајн проширење позива
finalметода.
- Метод проглашен као
-
Класе:
- Класа проглашена као
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
// }