Java Core: Java I/O. Лекция #14 (Часть 2)

preview_player
Показать описание
Курс " Программирование на Java с нуля " - 24%
Автор курса: Иван Головач
Рекомендации по теме
Комментарии
Автор

в этой лекции рассматривается
конструкция try-cath-with_resources

AibekDandaev
Автор

Ниже перечислены три ключевых момента, касающихся оператора try с ресурсами:

- ресурсы, управляемые оператором try с ресурсами, должны быть объектами классов, которые реализуют интерфейс AutoCloseable
- ресурс, объявленный в try с ресурсами, является неявно финальным; ресурс объявленный вне try с ресурсами, должен быть фактически финальным
- управлять можно более чем одним ресурсом, разделяя каждое объявление точкой с запятой

AibekDandaev
Автор

Фразы "неявно финальными" (implicitly final) и "фактически финальными" (effectively final) используются в контексте Java для описания переменных, особенно когда речь идет о лямбда-выражениях и анонимных классах.

Неявно финальные переменные

Неявно финальные переменные — это переменные, которые объявлены как `final`. То есть, они явно объявлены с модификатором `final` и их значение не может быть изменено после присваивания.


final int x = 10;
// x является неявно финальной переменной


Фактически финальные переменные

Фактически финальные переменные — это переменные, которые не объявлены с модификатором `final`, но их значение не изменяется после первоначального присваивания. Они ведут себя как `final` переменные, даже если формально таковыми не являются.


int y = 20;
// y является фактически финальной переменной, если её значение не изменяется далее в коде


Контекст использования

1.Лямбда-выражения

При использовании лямбда-выражений переменные, захваченные лямбдой, должны быть либо неявно финальными, либо фактически финальными. Это необходимо для обеспечения безопасности и предсказуемости кода, так как изменение значений таких переменных могло бы привести к непредвиденному поведению.

Пример с фактически финальной переменной:


public class LambdaExample {
public static void main(String[] args) {
int num = 10; // фактически финальная переменная
Runnable r = () -> {
System.out.println(num);
};
r.run();
}
}


Если попытаться изменить значение переменной `num` после её первоначального присваивания, компилятор выдаст ошибку:

public class LambdaExample {
public static void main(String[] args) {
int num = 10; // фактически финальная переменная
num = 20; // изменение значения переменной
Runnable r = () -> {
System.out.println(num); // ошибка компиляции
};
r.run();
}
}


2.Анонимные классы

Аналогично, при использовании переменных внутри анонимных классов они также должны быть неявно финальными или фактически финальными.

Пример с фактически финальной переменной:

public class AnonymousClassExample {
public static void main(String[] args) {
int num = 10; // фактически финальная переменная
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(num);
}
};
r.run();
}
}


Если попытаться изменить значение переменной `num` после её первоначального присваивания, компилятор снова выдаст ошибку:

public class AnonymousClassExample {
public static void main(String[] args) {
int num = 10; // фактически финальная переменная
num = 20; // изменение значения переменной
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(num); // ошибка компиляции
}
};
r.run();
}
}


Заключение

- Неявно финальные переменные объявлены с модификатором `final`.
- Фактически финальные переменные не объявлены с модификатором `final`, но их значение не изменяется после первоначального присваивания.
- При использовании лямбда-выражений и анонимных классов захваченные переменные должны быть либо неявно финальными, либо фактически финальными для обеспечения корректности и предсказуемости кода.

AibekDandaev
Автор

какое сочетание клавиш вы нажали, для того чтобы сгруппировать метод отдельно?

vagif_lalaev