2015-03-11 4 views
0

У меня очень простой вопрос, который кажется мне глупым, но все же спрашивающий. Как BufferedReader вызывает метод close() интерфейса Autocloseable. или как мы можем реализовать Autocloseable, которые автоматически вызывают close().Попробуй-ресурсы

+3

Он закрывает его при выходе из утверждения try. –

+1

Вы не можете реализовать 'Autocloseable', что он вызывает' close() 'автоматически вне' try ... with ... resources' – Andremoniy

ответ

0

Вам нечего делать в своем собственном коде, кроме реализации 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 
1

Это синтаксический сахар. Компилятор javac вставляет вызов close() в скомпилированный класс в конце блока try, где объявляется BufferedReader, так как вы можете увидеть, если вы разбираете файл класса с javap -c.

0

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.