2017-11-26 8 views
-2

Ich habe einen ständig laufenden Dienst, den ich sauber stoppen möchte, wenn es eine Ausnahme trifft. Dies passt gut zum Paradigma "Versuch mit Ressourcen", aber es ist nicht wirklich eine Ressource, die "geschlossen" werden muss.Verwenden von Try-mit-Ressourcen mit Dingen, die keine "Ressourcen" sind

Um basierend auf Kommentare zu klären, sieht mein Code so etwas wie diese

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

Gibt es ein Muster, das ich den syntaktischen Zucker verwenden kann, die versuchen-mit-Ressourcen zur Verfügung stellen, während immer noch nicht try-with-Ressourcen zu missbrauchen mit Dingen, die keine Ressourcen sind?

+0

Dies ist unklar. Was meinst du konkret mit "Service"? Und was beinhaltet "sauber stoppen"? –

+0

Es ist meist nur eine kontinuierlich laufende While-Schleife, die eine periodische Aufgabe ausführt. Diese Aufgabe erstellt intern einen Thread, der sich selbst mit den neuesten Daten einer Ressource aktualisiert. Beim Stoppen wird die Schleife unterbrochen und die Ressource geschlossen. – Glyde

+1

Um mit Ressourcen zu versuchen, müssen Sie nur 'Closable' implementieren. Aber Sie brauchen nichts in der nahen Methode –

Antwort

1

Natürlich ist es völlig in Ordnung try-with-resources mit allem, was Sie wollen, zu verwenden. Voraussetzung ist, dass es die Schnittstelle AutoCloseable (documentation) implementiert. Mit dieser Schnittstelle müssen Sie eine close Methode implementieren, die dann von try-with-resources Konstrukt aufgerufen wird.

Deshalb ist diese Schnittstelle vorhanden, Sie dürfen sie für Ihre eigenen Klassen implementieren.

Zum Beispiel, wenn Sie einen Dienst haben, der wahrscheinlich heruntergefahren werden muss, auch im Fehlerfall, können Sie AutoCloseable verwenden und wahrscheinlich die close Methode implementieren.

aber es sinnlos ist und Leser Ihres Programms verwirren, wenn Sie etwas machen AutoCloseable, wo es total ist keine Anschauung was schließen auf dieses Objekt führt. In solchen Fällen sollten Sie wahrscheinlich nach anderen Konstrukten suchen.


Es ist ein bisschen wie die Umsetzung Iterable, so dass Sie die verbesserte for-Schleife wie verwenden:

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

Sie können es tun, wenn es Sinn macht . Sonst wird es Leute verwirren.

+0

Das ist genau mein Anliegen. Ich mag den syntaktischen Zucker, den ich mit Ressourcen versuche und ich muss nicht die Fehlerbehandlung machen. Close() macht jedoch in diesem Zusammenhang keinen Sinn, und stop() ist was Sinn macht – Glyde

+0

Na dann nimm es nicht. Es ist in diesem Fall wirklich eine Meinung. Ich bezweifle, dass die Leute hier dir helfen können. Persönlich würde ich es nicht benutzen, aber ich mag das Konstrukt nicht so sehr. – Zabuza

+0

Vielleicht sollte meine Frage dann so sein: Gibt es einen Weg/ein Muster, Try-with-Resources in diesem Fall in einer Weise zu verwenden, die Sinn macht? Etwas wie eine ephemere Ressource, die vom Dienst verwendet wird? – Glyde

Verwandte Themen