Java 使用try with资源处理不属于;资源“;
我有一个持续运行的服务,如果它遇到异常,我希望它完全停止。这非常符合try-with-resources范式,但它并不是真正需要“关闭”的资源 为了根据注释进行澄清,我的代码如下所示Java 使用try with资源处理不属于;资源“;,java,coding-style,try-with-resources,Java,Coding Style,Try With Resources,我有一个持续运行的服务,如果它遇到异常,我希望它完全停止。这非常符合try-with-resources范式,但它并不是真正需要“关闭”的资源 为了根据注释进行澄清,我的代码如下所示 class Service { Resource resource; State state; boolean keepRunning = false; void start() { keepRunning = true; resource = new Resource()
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提供的语法糖,同时又不会滥用try with resources来处理非资源的东西?当然,可以使用try with resources处理任何你想要的东西。要求它实现接口
AutoCloseable
()。使用该接口,您需要实现一个close
方法,然后由try With resources构造调用该方法
这就是为什么有这个接口,您可以为自己的类实现它
例如,如果您有一个可能需要关闭的服务,并且在出现错误的情况下,您可以使用AutoCloseable
并执行close
方法
但是,如果您在完全没有直觉的情况下,使某个自动关闭,那么它将毫无意义,并将迷惑程序的读者。在这种情况下,您可能应该寻找其他构造
这有点像实现Iterable
,这样您就可以使用增强的for循环,比如:
如果它有意义的话,你可以这样做。否则会让人困惑。这还不清楚。具体来说,你所说的“服务”是什么意思?“干净地停止”涉及到什么?它主要是一个持续运行的while循环,运行一个周期性的任务。此任务在内部生成一个线程,该线程使用来自资源的最新数据不断更新自身。停止涉及到中断循环并关闭资源。为了使用try with resources,您只需要实现Closable
。但你不需要有任何秘密method@cricket我明白。我想理解的是,如果使用try-with-resources来做那些不是资源但确实适合的事情,是否可以paradigm@cricket_007AutoCloseable
这正是我关心的问题。我喜欢try-with-resources提供的语法糖,我不必做错误处理。但是,close()在这种上下文中没有任何意义,而stop()就是senseWell的意义所在,所以不要使用它。在这种情况下,这是基于观点的。我怀疑这里的人能否帮助你。就我个人而言,我不会使用它,但无论如何,我不太喜欢这个构造。也许我的问题应该是:在这种情况下,有没有一种方式/模式可以使用try with resources,使其有意义?有点像服务使用的短暂资源?@Glyde听起来你想要的是依赖注入,而不是生命周期management@cricket依赖注入将如何帮助我干净地启动和停止服务?
for (Item item : myObject) {
...
}