我们可以创建和使用我们自己的界面而不是由java定义吗?

时间:2017-11-09 18:34:01

标签: java try-with-resources

Q1:(已删除)

Q2:try-with-resource创建自己的资源工具AutoCloseable接口并覆盖close()方法。

来自javadoc

  

任何实现java.lang.AutoCloseable的对象(包括实现java.io.Closeable的所有对象)都可以用作资源。

所以,在这里我创建了一个简单的程序MyAuto.java

class Demo implements AutoCloseable {
    public void show() {
        System.out.println("show");
    }
    public void close() {
        System.out.println("close from demo");
    }
}

class MyAuto {
    public static void main(String[] args) {
        try(Demo d = new Demo()) {
            int x = 10/0;
            d.show();
        }catch(ArithmeticException e) {
            System.out.println(e);
        }
    }
}

这个程序运行正常。 :)并给出输出

close from demo:正如预期的那样,不会发生任何异常,d将被关闭。

但我的问题是我没有编写任何关闭此资源的代码,我只是简单地写了一个print语句。这里实际关闭资源意味着什么?将null分配给资源或其他任何参考变量? 或者JVM在场景后面运行close()后运行任何其他方法。

最后是最重要的问题..

问题3:在上面的场景中,如果我添加自己的界面AutoCloseable

interface AutoCloseable {
    void close() throws Exception;
}

在编译MyAuto.java

时会出现编译时错误

error: incompatible types: try-with-resources not applicable to variable type try(Demo d = new Demo()) { ^ (Demo cannot be converted to AutoCloseable)

所以,请回答为什么会发生这种情况。为什么我们不能创建和使用我们自己的接口而不是java提供的接口。虽然两者都相同,但我的界面和预定义界面之间有什么区别。

1 个答案:

答案 0 :(得分:0)

  

我的界面与预定义界面有什么区别,尽管两者都相同。

他们 相同。不是长篇大论。

AutoCloseable所需的try-with-resourcesjava.lang.AutoCloseable您的自定义AutoCloseable不是来自该软件包,因此Java不会尊重它。

最重要的是,介绍这不是最好的方法,因为它只会导致令人困惑的语义和后来的糟糕体验,即使你选择让你的界面因任何原因延长java.lang.AutoCloseable

以同样的方式......

  

...我没有编写任何关闭此资源的代码,我只是放了一个print语句。这里实际关闭资源意味着什么?为资源或其他任何参考变量分配null?或者JVM在场景后面运行close()后运行任何其他方法。

界面无法强制执行此类操作。它所能做的就是提供一种机制,如果实施得当,它将按照您的预期行事。