2017-11-26 6 views
-2

私は、例外に当たったときに、きれいに停止したいサービスを継続しています。これはリソースのパラダイムを試そうとするとうまく適合しますが、実際にはリソースを「閉鎖」する必要はありません。「リソース」以外のもので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(); 
    } 
} 

ようになります資源ではないもので?

+0

これは不明です。具体的には、「サービス」を意味しますか?そして「きれいに止まる」ことには何が関係していますか? –

+0

これは主に、定期的に実行されるwhileループです。このタスクは、内部的にリソースの最新のデータで更新を続けるスレッドを生成します。停止するには、ループを切り離してリソースを閉じる必要があります。 – Glyde

+1

リソースを使って試してみるには、 'Closable'を実装するだけです。しかし、クローズメソッドで何もする必要はありません –

答えて

1

もちろん、try-with-resourcesを好きなもので使っても大丈夫です。要件は、インターフェイスAutoCloseabledocumentation)を実装することです。そのインターフェイスでは、try-with-resourcesコンストラクトで呼び出されるcloseメソッドを実装する必要があります。

これは、このインターフェイスがある理由です。独自のクラス用にこのインターフェイスを実装することができます。

たとえば、おそらくエラーが発生した場合にサービスをシャットダウンする必要がある場合は、AutoCloseableを使用し、おそらくcloseメソッドを実装することができます。

それは無意味だとあなたはは、このオブジェクトに意味近いものを全く直感は完全ありません何かAutoCloseableを作る場合プログラムの読者を混乱させますが。そのような場合は、おそらく他の構造を探すべきです。


それは少しあなたのようなループのための強化を使用することができることをIterableように実装するようなものだ:それは意味を作る場合は、それを行うことが

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

を。さもなければ、人々を混乱させます。

+0

それはまさに私の心配です。私はリソースで試す構文的な砂糖が好きですし、エラー処理をする必要もありません。しかし、この文脈ではclose()は意味をなさないので、stop()は意味をなさないものです – Glyde

+0

それでは使用しないでください。その場合、実際には意見に基づいています。私はここの人々があなたを助けることができるとは思わない。個人的に私はそれを使用しませんでしたが、とにかく多くの構成を好きではありません。 – Zabuza

+0

おそらく私の質問はこれに当てはまるはずです:この場合、試行錯誤的なリソースを意味のある方法で使用する方法/パターンはありますか?サービスで使用される一時的なリソースを持つような何か? – Glyde

関連する問題