在try block

时间:2016-01-15 09:26:06

标签: java autocloseable

为了方便起见,我想使用AutoCloseable界面来处理一些应该在进一步用法之前完成的对象。

唯一的问题是try-with-resources块本身就是一个问题,我的意思是一般来说,为了获得对我的AutoCloseable实例的引用,我必须做这样的事情:

    MyCloseable mc;
    try (MyCloseable m = mc = new MyCloseable()) {
        m.doSomeStuff();
    }
    System.out.println(mc.getValue1());
    System.out.println(mc.getValue2());
    // ... and so on

这是这个结构:

MyCloseable mc;
try (MyCloseable m = mc = new MyCloseable()) {

看起来有些凌乱。所以我的问题更多的是关于设计问题。我怀疑java架构师没有设想try-w-r阻止这样使用的原因:

MyCloseable mc = new MyCloseable();
try (mc) { ... }

所以我可能会像上面描述的那样使用它吗?如果做到这一点是个好习惯吗?

编辑我被要求解释为什么我的问题与Why is declaration required in Java's try-with-resource不同

解释非常简单:我不是要求为什么?,但是:如果这样做是好的做法?

2 个答案:

答案 0 :(得分:2)

AutoCloseable的目的是在不再使用时自动执行清理。

因此,在try-with-resources块之后使用该对象会违反最不惊讶的原则。

答案 1 :(得分:0)

感谢@Tunaki,他给了我非常有用的相关问题链接:Why is declaration required in Java's try-with-resource

我不怀疑为什么存在这种限制,但我认为从设计的角度来看,我对使用的看法是不好的。

但根据Java-9 will allow such usage as

的事实
MyCloseable mc;
try (mc = new MyCloseable()) { ... }

我正在寻找什么,所以我想,我的问题的答案将是:是的,没关系