繁体   English   中英

消除自动关闭功能的麻烦

[英]Taking the nusances out of AutoCloseable

预先:我是一个现在正在使用Java的C#人员。 其中的一些挫败感是由于我缺乏Java知识而引起的。

首先,有没有一种方法可以使“安全”的AutoCloseable实现不需要检查Exception 如果我要嵌入自己的类,而该类不会从其close方法抛出,我不明白为什么必须检查它。

第二,有什么方法可以简化try语句中的表达式,而我不在乎返回的内容是什么? 例如在C#中,我可以这样做:

using (new Disposable()) 
{
    // yay!
}

Java似乎迫使我将其分配给一个临时变量:

try (AutoCloseable iDontCare = getAutoCloseable()) {
    // dont you dare use iDontCare
}

我希望我可以将Java简化为

try (getAutoCloseable()) {
    // yay!
}

C#并不是Java。 这是您今后必须处理的陷阱之一。

首先,有没有一种方法可以使“安全”的AutoCloseable实现不需要检查Exception 如果我要嵌入自己的类,而该类不会从其close方法抛出,我不明白为什么必须检查它。

必须 执行此操作 ,因为它是界面要求的。 不仅如此,但它抛出检查异常,这必须在一定程度上进行处理。

如果您知道自己的代码永远不会引发任何类型的异常,那么您仍然可以将异常的引发置于已实现的close方法内部的某种保证不会执行的块中。 或者,实现您自己的接口,该接口扩展AutoCloseable并覆盖close引发异常。

您的第一个问题:

是。 如果您的实现不引发检查异常,则可以在不引发异常的情况下实现AutoCloseable.close。

您的第二个问题:

否。try with resources语句需要该变量。 您可以将其重命名为忽略或未使用的名称,以使其变得清晰。

final class Test implements AutoCloseable {
    @Override
    public void close() {
        System.out.println("Closing");
    }

    public static void main(String[] args) {
        try (Test ignored = new Test()) {
            System.out.println("Not using ignored");
        }
    }
}

Makoto的回答很好地解决了问题的第一部分,因此我将尝试解决第二部分。

我认为您想要尝试一下(没有资源)。 例如:

try {
    //yay!
} finally {
   // always executed
}

无论是否引发异常,都将执行finally块。

编辑:如果不需要执行任何内容,则可以声明一个新块

{
    //yay!
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM