AutoCloseable
をjavaで実装することは重要ですか?JavaでAutoCloseableを追加することは重要ですか?
AutoCloseable
を実装するクラスを作成すると、それを実装していない他のクラスが拡張されますか?
例えば
public class IGetClosed extends ICannotBeClosed implements AutoCloseable {...}
AutoCloseable
をjavaで実装することは重要ですか?JavaでAutoCloseableを追加することは重要ですか?
AutoCloseable
を実装するクラスを作成すると、それを実装していない他のクラスが拡張されますか?
例えば
public class IGetClosed extends ICannotBeClosed implements AutoCloseable {...}
JavaでautoCloseableを実装することは重要ですか?
インターフェイスを実装することが重要であるかどうかは分かりません。しかし、それは必須ではありません。
AutoCloseableを実装するクラスを作成すると意味がありますか? は実装されていない他のクラスを拡張しますか?
これは問題ありません。何も間違っていません。
Java 7からAutoCloseableが追加されました。新しいtry-with-resourcesステートメント(Java 7+)で使用するように設計されています
同じ機能を提供する2つのクラスを参照してください。 1つはAutoCloseableを使用せず、もう1つはAutoClosableを使用しています。
// Not use AutoClosable
public class CloseableImpl {
public void doSomething() throws Exception { // ... }
public void close() throws Exception { // ...}
public static void main(String[] args) {
CloseableImpl impl = new CloseableImpl();
try {
impl.doSomething();
} catch (Exception e) {
// ex from doSomething
} finally {
try { // impl.close() must be called explicitly
impl.close();
} catch (Exception e) {
}
}
}
}
// Use AutoCloseable
public class AutoCloseableImpl implements AutoCloseable {
public void doSomething() throws Exception { // ... }
public void close() throws Exception { // ...}
public static void main(String[] args) {
// impl.close() will be called implicitly
try (AutoCloseableImpl impl = new AutoCloseableImpl()) {
impl.doSomething();
} catch (Exception e) {
// ex from doSomething
}
}
}
ご覧のとおり、 AutoClosbleを使用すると、コードが短くてきれいになります。
AutoCloseable
基本的にトライして、リソース文でそれを使用するときに、オブジェクトのリソースを自動的に閉じることができるインタフェースです。リソースを試行してオブジェクトを使用する予定がない場合は、そのオブジェクトをまったく実装する必要はありません。
継承のルールとして、いいえ、本質的にはに何もしたくありません。子クラスのリソースを自動クローズしたい場合は、すぐに進みます。
クラスがスーパークラスでも、AutoClosable
を実装しても問題ありません。実際には、Javaのすべてのクラスが直接的または間接的にjava.lang.Object
を拡張するため、AutoClosable
はすべて、このインタフェースを実装しないクラスを最終的に拡張します。
クラスにclose
の意味がある場合は、おそらくAutoClosable
を実装する必要があります。もしそうであれば、これはほとんど必要ありません。また、Java 7の構文上の試行錯誤をリソースの試行構文で行うことができます。ドキュメントから
:
無効近い() は例外
は、任意の基礎となるリソースを放棄、このリソースを閉じスローします。このメソッドは、try-with-resourcesステートメントで管理されているオブジェクトで自動的に呼び出されます。
例外をスローするように宣言されている間、実装者はcloseメソッドの具体的な実装を宣言して、より具体的な例外をスローするか、クローズ操作が失敗しない場合でも例外をスローすることを強く推奨します。
ですから、新しいクラスが自動的にトライして、リソース文で閉じられるようにしたい場合、あなたはこのようにあなたのICannotBeClosed
クラスにその機能を追加することができます。
これは基本的には問題ありません。あなたはこのコードを具体的にどのように使用していますか? –
私が考えることができる最大の利点は、 'AutoCloseables'だけで動作するtry-with-resourcesを使ってtry-catchで' finally'ブロックを使用する必要を避けることができることです。したがって、クローズするメソッドを持つクラスを作成した場合、スーパークラスが閉じられなくても 'AutoCloseable'を実装します。 – BackSlash
'Closeable'が' AutoCloseable'を拡張しているので、 'Closeable'より' AutoCloseable'を優先させる唯一の理由は、closeメソッドが 'IOException'以外のチェック例外を投げる必要がある場合です。 – dnault