Важно ли добавлять AutoCloseable в java?

Важно ли реализовать AutoCloseable в java?

Будет ли смысл, если я создам класс, который реализует AutoCloseable, расширяет другой класс, который его не реализует?

e.g

public class IGetClosed extends ICannotBeClosed implements AutoCloseable {...}

person Florian    schedule 29.06.2016    source источник
comment
Это, конечно, не проблема в принципе. Каково ваше конкретное использование этого кода?   -  person Yassin Hajaj    schedule 29.06.2016
comment
Самым большим преимуществом, о котором я могу думать, является возможность избежать использования блока finally в try-catch, используя try-with-resources, который работает только с AutoCloseables. Итак, если вы создадите класс с методом закрытия, я бы реализовал AutoCloseable, даже если суперкласс не может закрыться.   -  person BackSlash    schedule 29.06.2016
comment
Поскольку Closeable расширяет AutoCloseable, единственная причина предпочесть AutoCloseable Closeable заключается в том, что методу close необходимо генерировать проверенное исключение, отличное от IOException.   -  person dnault    schedule 29.06.2016


Ответы (4)


Важно ли реализовать autoCloseable в java?

Трудно сказать, важно или нет реализовывать интерфейс. Но это не обязательно.

Будет ли смысл, если я создам класс, который реализует AutoCloseable, расширяет другой класс, который его не реализует?

Это нормально. Ничего плохого.

AutoCloseable был добавлен из Java 7. Он предназначен для использования с новым оператором try-with-resources (Java 7+).

См. два приведенных ниже класса, обеспечивающих одинаковую функциональность. Один не использует AutoClosable, а другой использует AutoClosable:

// Not use AutoClosable
public class CloseableImpl {
    public void doSomething() throws Exception { // ... }
    public void close() throws Exception { // ...}

    public static void main(String[] args) {
        CloseableImpl impl = new CloseableImpl();
        try {
            impl.doSomething();

        } catch (Exception e) {
            // ex from doSomething
        } finally {
            try { //  impl.close() must be called explicitly
                impl.close();
            } catch (Exception e) {
            }
        }
    }
}


// Use AutoCloseable 
public class AutoCloseableImpl implements AutoCloseable {
    public void doSomething() throws Exception { // ... }
    public void close() throws Exception { // ...}

    public static void main(String[] args) {

        // impl.close() will be called implicitly
        try (AutoCloseableImpl impl = new AutoCloseableImpl()) {
            impl.doSomething();
        } catch (Exception e) {
          // ex from doSomething
        }
    }
}

Как видишь. Использование AutoClosble сделает код короче и чище.

person Loc    schedule 29.06.2016

AutoCloseable — это интерфейс, который по существу позволяет автоматически закрывать ресурсы объекта при его использовании в операторе try-with-resources. Если вы не планируете использовать свой объект с try-with-resources, нет необходимости его реализовывать.

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

person Zircon    schedule 29.06.2016

Нет проблем в том, чтобы класс реализовал AutoClosable, даже если это не реализовано в суперклассе. На самом деле, поскольку все классы в Java прямо или косвенно расширяют java.lang.Object, все AutoClosable в конечном итоге расширяют класс, который не реализует этот интерфейс.

Если в вашем классе есть некоторая семантика closeing, вам, вероятно, следует реализовать AutoClosable. Это почти ничего не стоит, если вообще ничего не стоит, и позволяет вам использовать аккуратное синтаксическое обсахаривание Java 7 синтаксиса try-with-resource.

person Mureinik    schedule 29.06.2016

Из документации:

void close() выдает исключение

Закрывает этот ресурс, отказываясь от всех базовых ресурсов. Этот метод вызывается автоматически для объектов, управляемых оператором try-with-resources.

Хотя этот интерфейсный метод объявлен для генерации исключения, разработчикам настоятельно рекомендуется объявлять конкретные реализации метода close для создания более конкретных исключений или вообще не создавать исключений, если операция закрытия не может завершиться ошибкой.

Поэтому, если вы хотите, чтобы новый класс автоматически закрывался в операторе try-with-resources, вы могли бы добавить эту функциональность в свой класс ICannotBeClosed.

person Koos Gadellaa    schedule 29.06.2016