Я хочу использовать улучшение try-with-resources в Java 9, поместив ссылочную переменную внутрь try with resources вместо всего объявления переменной. Я также знаю, что для этого я должен следовать правилу: Variable used as a try-with-resources resource should be final or effectively final
. Сначала я попробую с локальной, а затем с переменной экземпляра.
- Локальная переменная:
-Я делаю переменную final, которая следует заданному правилу и отлично компилируется:
public static void main (String[] args) throws IOException{
final FileWriter fw = new FileWriter ("test.txt");
try(fw) {
//some code
}
}
-Если бы я также удалил ключевое слово final, он снова скомпилировался бы, поскольку fw
считается действительно окончательным -переменными, которые инициализируются только один раз и никогда не изменяются.
public static void main (String[] args) throws IOException{
FileWriter fw = new FileWriter ("test.txt");
try(fw) {
//some code
}
}
- Переменная экземпляра:
Но будет ли этот же шаблон работать и для переменной экземпляра? Давай попробуем.
-Сначала давайте сделаем переменную экземпляра final, которая снова следует правилу и компилируется нормально:
public class Test {
final FileWriter fw = new FileWriter ("a.txt");
void m1() throws IOException {
try(fw ) {
//some code
}
}
}
-Если я удалю ключевое слово final, оно должно снова скомпилироваться, не так ли? Поскольку я нигде не мутирую fw
, а инициализирую его только один раз, это должно быть эффективным окончательным. К сожалению, это не сработает:
public class Test {
FileWriter fileWriter = new FileWriter ("a.txt");
void m1() throws IOException {
try(fileWriter) {
//some code
}
}
}
Это дает мне сообщение: Переменная, используемая в качестве ресурса попытки с ресурсами, должна быть окончательной или фактически окончательной. Итак, после всего этого, я возвращаюсь к своему первому вопросу. Может ли переменная экземпляра когда-либо быть фактически final или этот термин используется только для локальных переменных? Как я только что показал, я никогда не изменяю переменную (которую следует считать фактически окончательной), однако компилятор никогда не угрожает ей как таковой.
final
. Не требуется, если переменная объявлена локально. - person hfontanez   schedule 12.11.2020