Closable и AutoClosable в Java

Начиная с jdk5 в Java появился интерфейс Closable. Основная идея интерфейса предоставлять единообразный способ закрывать уже ненужные ресурсы. При этом в jdk7 появилась возможность лаконично объявлять и инициализировать ресурсы, не думая о том, когда и где ресурс нужно будет закрыть.

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

Код выше взят из официального урока по языку Java. Таким образом, появилась приятная возможность ограничить зону видимости (scope) и жизненный цикл таких ресурсов, как файлы и потоки ввода вывода. Более того, вызов метода close() такого интерфейса идемпотентный, то есть не произойдёт ничего страшного, если вы вызовите метод несколько раз. Зачем и когда это может произойти? Если вы используете поток ввода-вывода, помещаете (wrap) его в другой поток или Reader/Writer, то согласно документации, при закрытии объекта-обёртки закрывается и ресурс, который в него завёрнут. Если же вы создали поток или другой ресурс выше по стеку, то не можете быть уверены, будет ли он явно или неявно закрыт. Вот здесь и полезна возможность вызывать метод close() несколько раз. Если к моменту возвращения к мест создания ресурса, вы явно или неявно уже его закрыли, то повторный вызов метода просто не будет иметь эффекта. Зачем же нужен интерфейс AutoClosable? На самом деле, любой Closable, начиная с jdk7 является AutoClosable. Но с AutoClosable снято одно ограничение. Метод close() может бросать любое исключение, а не только IOException. С другой стороны, в отличие от Closable, вызывать close() на AutoClosable можно только единожды.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>