在java中添加AutoCloseable很重要吗?

时间:2016-06-29 18:58:50

标签: java autocloseable

在java中实现AutoCloseable是否很重要?

如果我创建一个实现AutoCloseable的类扩展另一个没有实现它的类会有意义吗?

e.g

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

4 个答案:

答案 0 :(得分:2)

  

在java中实现autoCloseable很重要吗?

很难说实现接口很重要。但这不是必需的。

  

如果我创建一个实现AutoCloseable的类,那会有意义吗?   扩展了另一个没有实现它的类?

这样做是可以的。没错。

AutoCloseable是从Java 7添加的。它设计用于新的try-with-resources语句(Java 7 +)

请参阅以下两个提供相同功能的类。一个不使用AutoCloseable而另一个使用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将使代码更短更清晰。

答案 1 :(得分:1)

AutoCloseable是一个接口,它基本上允许在try-with-resources语句中使用对象的资源时自动关闭它。如果您不打算在try-with-resources中使用对象,则根本不需要实现它。

作为继承规则,不,在执行您想要做的事情时没有任何本身错误。如果要自动关闭子类中的资源,请直接进行。

答案 2 :(得分:1)

有一个类实现AutoClosable没有问题,即使它的超级类没有。实际上,由于Java中的所有类直接或间接地扩展java.lang.Object,所有AutoClosable最终都会扩展一个不实现此接口的类。

如果你的类有一些close的语义,你应该让它实现AutoClosable。它几乎没有任何成本,如果有的话,它允许你使用Java 7的try-with-resource语法的整洁语法糖。

答案 3 :(得分:1)

来自文档:

  

void close()            抛出异常

     

关闭此资源,放弃任何底层资源。在try-with-resources语句管理的对象上自动调用此方法。

     

虽然声明此接口方法抛出Exception,但强烈建议实现者声明close方法的具体实现以抛出更多特定异常,或者如果close操作不能失败则不抛出任何异常。

因此,如果您希望在try-with-resources语句中自动关闭新类,则可以将该功能添加到ICannotBeClosed类中。