使用try-with-resources与不是"资源"

时间:2017-11-26 19:31:39

标签: java coding-style try-with-resources

我有一个持续运行的服务,如果它遇到异常,我想要干净利落地停止。这与资源范例的尝试很吻合,但它并不是真正需要关闭的资源"。

根据评论澄清,我的代码看起来像这样

class Service {
  Resource resource;
  State state;
  boolean keepRunning = false;

  void start() {
     keepRunning = true;
     resource = new Resource()
     new Thread(() -> {
            while(keepRunning) {
                Data data = resources.pull();
                state.update(data);
                ... // Do stuff with state
            }
        }).start();
  }
  void stop() {
    keepRunning = false;
  }
}

class Main {
   void run() {
        Service service = new Service();
        service.start();
   }
}

是否有一种模式可以让我使用try-with-resources提供的语法糖,同时仍然不会滥用资源尝试资源?

1 个答案:

答案 0 :(得分:1)

当然,将试用资源与任何你想要的东西一起使用是完全可以的。要求是它实现了接口AutoCloseabledocumentation)。使用该界面,您需要实现close方法,然后由 try-with-resources 构造调用该方法。

这就是为什么这个界面在那里,你可以为你自己的类实现它。

例如,如果您有可能需要关闭的服务,也可能出现错误情况,您可以使用AutoCloseable并尽可能实施close方法。

然而,如果你创造了一些完全没有直觉的东西AutoCloseable,那么毫无意义并且会使你的程序的读者感到困惑 关闭表示此对象。在这种情况下,你应该寻找其他结构。

这有点像实现Iterable,以便您可以使用增强型for循环,如:

for (Item item : myObject) {
    ...
}

如果有意义,您可以这样做。否则会让人迷惑。