【问题标题】:Reference to AutoCloseable instance outside try block在 try 块外引用 AutoCloseable 实例
【发布时间】:2016-04-20 20:40:25
【问题描述】:

为了方便起见,我想使用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不同

解释很简单:我不是在问为什么?,而是:如果这样做是个好习惯?

【问题讨论】:

  • 我认为this 是同一个问题。这将在 Java 9 中成为可能。
  • @Tunaki 谢谢,但我不问为什么这样,我问,从设计的角度来看,这样使用它可以吗
  • 啊,所以你问这样做是否是一个好习惯?
  • @Tunaki 是的,当然。但无论如何,您的链接非常有用
  • 我猜是这样:)。我找不到任何客观的参考。最初的增强请求是here,讨论here

标签: java autocloseable


【解决方案1】:

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

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

但是根据Java-9will allow such usage as这个事实

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

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

【讨论】:

    【解决方案2】:

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

    所以在try-with-resources块之后使用对象会违反最小惊讶原则。

    【讨论】:

    • 我不同意原因有两个:1) java-9 将允许这样的使用; 2)java-8中的Stream接口也是AutoCloseable但是真的没必要。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多