2016-05-30 18 views
-1

Ich habe eine Java-Klasse, die Ressourcen zugewiesen hat, die geschlossen werden müssen. Ich weiß nicht wirklich, wie man dies erzwingt, mein aktueller Ansatz ist die Implementierung der Schnittstelle AutoCloseable, in der Hoffnung, dass der Anrufer close() manchmal anruft und eine boolean geschlossen, die zu Beginn jeder Methode überprüft wird und wenn true, wirft die Methode IllegalStateException.Was ist die beste Praxis zum Schließen von Ressourcen?

Beide, dass der Anrufer close() aufrufen muss und dass ich am Anfang jeder Methode geschlossen zu prüfen, sind nicht wirklich nett, gibt es einige Best Practice, um dies zu vermeiden?

+0

Ihre Frage ist nicht klar. Machen Sie es klar und teilen Sie das Code-Snippet. Es würde uns helfen, Ihr Problem zu verstehen –

+1

"Hoffe das" ?? Dokumentieren Sie Ihre Klassen einfach so, dass Sie grundsätzlich sagen: "Wenn Sie diese Klasse nicht schließen(), ist das Verhalten nicht definiert. Verwenden Sie eine try-with-resources-Anweisung." Job erledigt. – fge

+0

Die einzige Best Practice, die mir einfällt, ist "mach's gut". Wenn jemand mit Ihrem Code das nicht tut, dann ist das sein Problem. Die einzige andere Sache, die ich hinzufügen würde, ist "Schließen Sie nur eine Ressource, die Sie geöffnet haben". –

Antwort

2

Machen Sie Ihre Klasse implementieren die Schnittstelle AutoCloseable ist ein guter Ansatz in Ihrem Fall, wie es in einer try-with-resource Anweisung verwendet werden kann.

Wenn aus irgendeinem Grund würden Sie das Risiko, dass Instanzen des Objekts begrenzen möchte nicht richtig Undichtigkeiten zu vermeiden geschlossen, können Sie die finalize Methode als nächste außer Kraft setzen:

@Override 
protected void finalize() throws Throwable { 
    try { 
     this.close(); 
    } finally { 
     super.finalize(); 
    } 
} 

WARNUNG 1: Implementieren Die Methode finalize muss mit großer Vorsicht durchgeführt werden, da dies die Arbeit des GC verlangsamt, so dass Sie sicherstellen müssen, dass Ihr Code schnell ausgeführt werden kann.

WARNUNG 2: Die finalize Verfahren nicht notwendig, so vertrauen Sie darauf close Ihr Objekt nicht genannt wird, hilft es nur um das Risiko zu reduzieren, die Benutzer des Objekts haben immer noch die Verantwortung close es richtig .

+1

Finalizer-Methoden werden nicht garantiert * immer * aufgerufen. Wenn also die Ressource wirklich * immer * geschlossen werden muss, ist dies keine 100% ige Lösung. – Jesper

+0

Meine Antwort wäre: es gibt keine gute Möglichkeit, dies in Java zu erzwingen, überlassen Sie es der Verantwortung des Benutzers der Klasse, die 'close()' Methode aufzurufen. Ich stimme zu, dass die Implementierung von 'AutoCloseable' eine gute Idee ist, dies sollte dem Benutzer zumindest einen Hinweis geben, dass 'close()' aufgerufen werden muss. – Jesper

+0

@Jasper Ich habe meine Antwort aktualisiert, um eine Warnung hinzuzufügen, bitte überprüfen Sie noch einmal –

Verwandte Themen