Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用try with资源处理不属于;资源“;_Java_Coding Style_Try With Resources - Fatal编程技术网

Java 使用try with资源处理不属于;资源“;

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()

我有一个持续运行的服务,如果它遇到异常,我希望它完全停止。这非常符合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提供的语法糖,同时又不会滥用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_007
AutoCloseable
这正是我关心的问题。我喜欢try-with-resources提供的语法糖,我不必做错误处理。但是,close()在这种上下文中没有任何意义,而stop()就是senseWell的意义所在,所以不要使用它。在这种情况下,这是基于观点的。我怀疑这里的人能否帮助你。就我个人而言,我不会使用它,但无论如何,我不太喜欢这个构造。也许我的问题应该是:在这种情况下,有没有一种方式/模式可以使用try with resources,使其有意义?有点像服务使用的短暂资源?@Glyde听起来你想要的是依赖注入,而不是生命周期management@cricket依赖注入将如何帮助我干净地启动和停止服务?
for (Item item : myObject) {
    ...
}