1

AutoCloseable在java中实现重要吗?

如果我创建一个实现AutoCloseable扩展另一个不实现它的类的类是否有意义?

例如

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

4 回答 4

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 将使代码更短更清晰。

于 2016-06-29T19:10:30.037 回答
1

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

作为继承的规则,不,做你想做的事本质上没有错。如果您想自动关闭子类中的资源,请继续。

于 2016-06-29T19:02:45.827 回答
1

AutoClosable即使超类没有实现类,也没有问题。实际上,由于 Java 中的所有类java.lang.Object都直接或间接扩展,所有的AutoClosables 最终都扩展了一个没有实现该接口的类。

如果你的类有一些语义close,你可能应该让它实现AutoClosable。这样做几乎没有成本,如果有的话,它允许您使用 Java 7 对 try-with-resource 语法的简洁语法糖化。

于 2016-06-29T19:04:04.550 回答
1

从文档中:

void close() 抛出异常

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

虽然此接口方法被声明为抛出异常,但强烈建议实现者声明 close 方法的具体实现以抛出更具体的异常,或者如果关闭操作不会失败,则根本不抛出异常。

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

于 2016-06-29T19:05:03.913 回答