我有一个持续运行的服务,如果它遇到异常,我想要干净利落地停止。这与资源范例的尝试很吻合,但它并不是真正需要关闭的资源"。
根据评论澄清,我的代码看起来像这样
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提供的语法糖,同时仍然不会滥用资源尝试资源?
答案 0 :(得分:1)
当然,将试用资源与任何你想要的东西一起使用是完全可以的。要求是它实现了接口AutoCloseable
(documentation)。使用该界面,您需要实现close
方法,然后由 try-with-resources 构造调用该方法。
这就是为什么这个界面在那里,你可以为你自己的类实现它。
例如,如果您有可能需要关闭的服务,也可能出现错误情况,您可以使用AutoCloseable
并尽可能实施close
方法。
然而,如果你创造了一些完全没有直觉的东西AutoCloseable
,那么毫无意义并且会使你的程序的读者感到困惑 关闭表示此对象。在这种情况下,你应该寻找其他结构。
这有点像实现Iterable
,以便您可以使用增强型for循环,如:
for (Item item : myObject) {
...
}
如果有意义,您可以这样做。否则会让人迷惑。