2016-06-29 8 views
1

Ist es wichtig, AutoCloseable in Java zu implementieren?Ist es wichtig, AutoCloseable in Java hinzuzufügen?

Wäre es sinnvoll, wenn ich eine Klasse erstellen würde, die implementiert AutoCloseable erweitert eine andere Klasse, die es nicht implementiert?

beispiel

public class IGetClosed extends ICannotBeClosed implements AutoCloseable {...} 
+0

Dies ist im Grunde kein Problem. Wie verwenden Sie diesen Code konkret? –

+1

Der größte Vorteil, den ich mir vorstellen kann, ist die Möglichkeit, einen 'finally'-Block in einem try-catch zu vermeiden, indem man einen try-with-resources benutzt, der nur mit' AutoCloseables' arbeitet. Also, wenn Sie eine Klasse erstellen, die eine Methode zum Schließen hat, würde ich 'AutoCloseable' implementieren, selbst wenn die Oberklasse nicht geschlossen werden kann. – BackSlash

+0

Da 'Closeable'' AutoCloseable' erweitert, ist der einzige Grund, 'AutoCloseable' gegenüber' Closeable' zu ​​bevorzugen, wenn die close-Methode eine andere überprüfte Ausnahme als 'IOException' auslösen muss. – dnault

Antwort

2

Ist es wichtig, autoCloseable in Java zu implementieren?

Es ist schwer zu sagen, ob es wichtig ist oder nicht, die Schnittstelle zu implementieren. Aber es ist nicht erforderlich.

Wäre es sinnvoll, wenn ich eine Klasse erstellen, die AutoCloseable implementieren erweitert eine andere Klasse, die es nicht implementiert?

Es ist OK, das zu tun. Nichts Falsches.

AutoCloseable wurde von Java 7 hinzugefügt.Es wurde für die Verwendung mit neuen try-with-resources-Anweisungen (Java 7+) entwickelt.

Siehe die beiden folgenden Klassen mit derselben Funktionalität. Einer verwendet nicht AutoCloseable und der andere verwendet AutoClosable:

Wie Sie sehen. Mit AutoClosble wird der Code kürzer und sauberer.

1

AutoCloseable ist eine Schnittstelle, die automatisch Ressourcen eines Objekts geschlossen werden, wenn es in einer Try-mit-Ressourcen-Anweisung im Wesentlichen ermöglicht. Wenn Sie Ihr Objekt nicht mit try-with-resources verwenden möchten, müssen Sie es nicht implementieren.

Als eine Regel der Vererbung, nein, gibt es nichts inhärent falsch mit tun, was Sie tun möchten. Wenn Sie Ressourcen in der untergeordneten Klasse automatisch schließen möchten, fahren Sie fort.

1

Es gibt kein Problem in einer Klasse implementieren AutoClosable, auch wenn es Superklasse ist nicht. Da alle Klassen in Java entweder direkt oder indirekt java.lang.Object erweitern, erweitern schließlich alle AutoClosable s eine Klasse, die diese Schnittstelle nicht implementiert.

Wenn Ihre Klasse eine Semantik von close hat, sollten Sie sie wahrscheinlich implementieren AutoClosable implementieren. Es kostet so gut wie nichts, wenn überhaupt, und es erlaubt Ihnen, Java 7's sauberes syntaktisches Sugaring der Try-with-Resource-Syntax zu verwenden.

1

Aus der Dokumentation:

void close() throws Exception

Schließt diese Ressource, zugrunde liegende Ressourcen zu verzichten. Diese Methode wird automatisch für Objekte aufgerufen, die von der try-with-resources-Anweisung verwaltet werden.

Während diese Schnittstellenmethode zum Auslösen einer Ausnahme deklariert ist, wird dringend empfohlen, Implementierer konkrete Implementierungen der close-Methode zu deklarieren, um spezifischere Ausnahmen auszulösen oder gar keine Ausnahme auszulösen, wenn die Schließoperation nicht fehlschlagen kann.

Also, wenn Sie die neue Klasse wollen automagically in einer Try-mit-Ressourcen Anweisung geschlossen werden, man könnte so die Funktionalität auf Ihre ICannotBeClosed Klasse hinzuzufügen.

Verwandte Themen