2016-06-29 18 views
1

AutoCloseableをjavaで実装することは重要ですか?JavaでAutoCloseableを追加することは重要ですか?

AutoCloseableを実装するクラスを作成すると、それを実装していない他のクラスが拡張されますか?

例えば

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

これは基本的には問題ありません。あなたはこのコードを具体的にどのように使用していますか? –

+1

私が考えることができる最大の利点は、 'AutoCloseables'だけで動作するtry-with-resourcesを使ってtry-catchで' finally'ブロックを使用する必要を避けることができることです。したがって、クローズするメソッドを持つクラスを作成した場合、スーパークラスが閉じられなくても 'AutoCloseable'を実装します。 – BackSlash

+0

'Closeable'が' AutoCloseable'を拡張しているので、 'Closeable'より' AutoCloseable'を優先させる唯一の理由は、closeメソッドが 'IOException'以外のチェック例外を投げる必要がある場合です。 – dnault

答えて

2

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を使用すると、コードが短くてきれいになります。

1

AutoCloseable基本的にトライして、リソース文でそれを使用するときに、オブジェクトのリソースを自動的に閉じることができるインタフェースです。リソースを試行してオブジェクトを使用する予定がない場合は、そのオブジェクトをまったく実装する必要はありません。

継承のルールとして、いいえ、本質的にはに何もしたくありません。子クラスのリソースを自動クローズしたい場合は、すぐに進みます。

1

クラスがスーパークラスでも、AutoClosableを実装しても問題ありません。実際には、Javaのすべてのクラスが直接的または間接的にjava.lang.Objectを拡張するため、AutoClosableはすべて、このインタフェースを実装しないクラスを最終的に拡張します。

クラスにcloseの意味がある場合は、おそらくAutoClosableを実装する必要があります。もしそうであれば、これはほとんど必要ありません。また、Java 7の構文上の試行錯誤をリソースの試行構文で行うことができます。ドキュメントから

1

無効近い() は例外

は、任意の基礎となるリソースを放棄、このリソースを閉じスローします。このメソッドは、try-with-resourcesステートメントで管理されているオブジェクトで自動的に呼び出されます。

例外をスローするように宣言されている間、実装者はcloseメソッドの具体的な実装を宣言して、より具体的な例外をスローするか、クローズ操作が失敗しない場合でも例外をスローすることを強く推奨します。

ですから、新しいクラスが自動的にトライして、リソース文で閉じられるようにしたい場合、あなたはこのようにあなたのICannotBeClosedクラスにその機能を追加することができます。

関連する問題