从AutoCloseable中取出nusances

时间:2017-03-17 17:39:44

标签: java java-7

预先说明:我现在正在做一个做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!
}

3 个答案:

答案 0 :(得分:2)

C#并不是Java;这是你未来必须处理的问题之一。

  

首先,是否有一种方法可以安全地使用"安全" AutoCloseable实施不需要检查Exception?如果我对我自己的班级不感兴趣,我不会从close方法中抛弃,我就不明白为什么要检查它。

到因为it's mandated by the interface.不仅仅是这样,但它会抛出一个已检查的异常, 必须在某个级别处理。

如果你知道你的代码永远不会抛出任何类型的异常,你仍然可以将异常的抛出放在某种保证 - 不执行 - 阻止您实现的close方法内部。或者,实现您自己的扩展AutoCloseable的接口,并覆盖close而不是抛出异常。

答案 1 :(得分:1)

你的第一个问题:

是。如果您的实现没有抛出已检查的异常,则可以在没有抛出异常部分的情况下实现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");
        }
    }
}

答案 2 :(得分:0)

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

我认为你想要的是一次尝试(没有资源)。例如:

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

无论是否抛出异常,finally块都将执行。

修改 如果您不需要执行任何操作,则可以声明一个新块

{
    //yay!
}