Sobes.tech
Junior

Дар кадом ҳолатҳо модификатори final дар Java истифода мешавад?

sobes.tech AI

Ҷавоб аз AI

Java-да final модификаторін қолдануға болады:

  1. Өзгермейтіндер:
    • Жергілікті өзгермейтіндер: Олардың мәні бір рет тағайындалады және инициализациядан кейін өзгертілмейді.
    • Класс өрістері: Өріс мәні немесе жариялау кезінде немесе конструкторда тағайындалады және одан әрі өзгертілмейді.
    • Әдіс параметрлері: Әдіс ішіндегі параметр константаға айналады; оны әдіс денесінде қайта тағайындауға болмайды.

final қолдану өзгермейтіндерге:

  • Тұрақтылық: Мән өзгермейтінін кепілдік береді.
  • Жіп қауіпсіздігі: final кластың өрісі автоматты түрде барлық ағындарға көрінетін болады, конструктор аяқталғаннан кейін қосымша синхрондаусыз.
  • Компилятордың оңтайландырулары: Компилятор мән өзгермейтінін білген кезде кейбір оңтайландыруларды жасай алады.
  1. Әдістер:

    • final деп жарияланған әдіс ұрпақ кластарында қайта анықталмайды.
    • Бұл:
      • Қажетсіз өзгерістерді болдырмау: Әдістің логикасы өзгермейтінін кепілдік береді.
      • Құрылымдау ынтымақтастығын ынталандыру: Мұрагерліктің орнына құрастыруды қолдануға итермелейді.
      • Компилятордың оңтайландырулары: Компилятор final әдістердің шақыруларын инлайн етуі мүмкін.
  2. Кластар:

    • final деп жарияланған класс мұрагерлікке жабық.
    • Бұл қолдану:
      • Тұрақты (immutable) кластарды құру: Мысалы, примитивтердің орау кластарын (Integer, String).
      • Дизайнды қорғау: Мұрагерлікті болдырмайды, ол кластың инварианттарын бұзуы мүмкін.
      • Қауіпсіздікті арттыру: Кластың мінез-құлқы өзгермейтінін кепілдік береді.
Қолдану Сипаттама Артықшылықтар
final өріс Мән бір рет тағайындалады (жариялау немесе конструкторда). Тұрақтылық, жіп қауіпсіздігі, оңтайландырулар.
final параметр Мән әдіс ішінде өзгертілмейді. Анық сигнатура, параметр мәнінің өзгермейтіндігіне кепілдік.
final әдіс Ұрпақ кластарында қайта анықталмайды. Мінез-құлықты өзгертуге жол бермейді, құрастыруды ынталандырады, оңтайландырулар.
final класс Мұрагерлікке жабық (наследование мүмкін емес). Кластың тұрақтылығы, дизайнды қорғау, қауіпсіздікті арттыру.

Мысалдар:

public class Example {
    // final өріс
    private final String name;

    // final примитивті өріс
    private final int id;

    // final, бірақ әртүрлі объектілерге сілтеме болуы мүмкін List-ке, әлі құрылған жоқ
    // объектіні құрғаннан кейін, List-ке сілтемені өзгертуге болады, бірақ басқа 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
// }