У меня очень простой вопрос, который кажется мне глупым, но все же спрашивающий. Как BufferedReader вызывает метод close() интерфейса Autocloseable. или как мы можем реализовать Autocloseable, которые автоматически вызывают close().Попробуй-ресурсы
ответ
Вам нечего делать в своем собственном коде, кроме реализации AutoCloseable
и предоставить метод close()
. Java заботится о вызове для вас метода close()
в конце инструкции try
. Рассмотрим следующую минимальную демонстрацию:
class MyCloseable implements AutoCloseable {
public void close() { System.out.println("Close was called"); }
}
public class Ac {
public static void main(String[] args) {
try (MyCloseable mc = new MyCloseable()) {
}
}
}
$ java Ac
Close was called
Это синтаксический сахар. Компилятор javac вставляет вызов close()
в скомпилированный класс в конце блока try
, где объявляется BufferedReader
, так как вы можете увидеть, если вы разбираете файл класса с javap -c
.
try(AutoClosable x = open()) {}
обычно рассматривается как вариант короткого рук
try{ Resource x = open(); } finally { x.close(); }
Есть две фактические различия: Если оба блока броска, autoclosable try
заявление будет бросать исключение внутри try
заявления, в то время как try...finally
выдает исключение из блока finally. Исключение из другого блока будет подавлено.
Кроме того, точное поведение, как это:
try(Autoclosable x = open){
//do something
} do_close {
x.close();//not actually there - executed before catch and finally!
} catch (WhateverException e){
//catch an exception
} finally{
//finally do something
}
Из Oracle Docs: «А попробуйте с-ресурсами оператор может иметь защелку и, наконец, блоки так же, как обычный оператор Ьги В примерочном с. -resources, любой catch или finally-блок запускается после того, как объявленные ресурсы были закрыты ».
Так что из-за этих двух технических деталей это не просто синтаксический сахар, но на практике он используется там, где раньше использовался бы try...finally
.
Нет реального способа имитировать поведение try-in-resources для других интерфейсов, чем Autoclosable
afaik. Если вы хотите сделать некоторую очистку после попытки, вам придется либо использовать finally
, либо реализовать Autoclosable
. Финализаторы, похоже, делают что-то подобное, но на самом деле они этого не делают. Я просто упоминаю их здесь advise you not to use them.
Он закрывает его при выходе из утверждения try. –
Вы не можете реализовать 'Autocloseable', что он вызывает' close() 'автоматически вне' try ... with ... resources' – Andremoniy