JDK1.7でAutoCloseableインタフェースの使用について

10102 ワード

1.APIドキュメントの表示、AutoCloseable関連定義の検索
public interface AutoCloseable

このインタフェースはJDK 1からなる.7導入が開始され、インタフェースには1つの方法close()しかありません.
1 void close() throws Exception //  , 

 
  2.AutoCloseableインタフェースをテストし、自動クローズ処理を実現する
2.1新規インタフェースIMessage AutoCloseableインタフェースの継承
1 interface IMessage extends AutoCloseable {
2     public void send(); // 
3 }

2.2新規NetMessageクラス実装IMessageインタフェース(注意13行:close()メソッド放出異常)
 1 class NetMessage implements IMessage { // 
 2     private String msg;
 3 
 4     public NetMessage(String msg) {
 5         this.msg = msg;
 6     }
 7 
 8     public boolean open() { //  
 9         System.out.println("【OPEN】 ");
10         return true;
11     }
12 
13     public void close() throws Exception {
14         System.out.println("【CLOSE】 ");
15     }
16 
17     @Override
18     public void send() {
19         if (this.open()) {
20             System.out.println("【** **】" + this.msg);
21         }
22     }
23 }

2.3試験類
1 try (IMessage message = new NetMessage("Hello world")) {
2   message.send();
3 } catch (Exception e) {
4   e.printStackTrace();
5 }

2.4運転結果
【OPEN】 
【** **】Hello world
【CLOSE】 

 
   3.FileWriterを例に、2つの異なる操作方法を比較します.
  3.1.JDK1.7の前にfinallyブロックで手動でリソースを閉じます
 1     public static void writeFile(String str) {
 2         FileWriter fw = null;
 3         try {
 4             fw = new FileWriter("E://test.txt", true);
 5             fw.write(str);
 6         } catch (IOException e) {
 7             e.printStackTrace();
 8         } finally {
 9             if (fw != null) {
10                 try {
11                     fw.close();
12                 } catch (IOException e) {
13                     e.printStackTrace();
14                 }
15             }
16         }
17     }

問題:
  • 開発中に一部の資源を閉鎖することを忘れ、メモリが漏れてしまう可能性がある.
  • クローズコードは論理的に冗長で、読みやすさが悪い.

  •  
       3.2.JDK1.7以降、AutoCloseableで自動クローズ
    1     public static void newWriteFile(String str) {
    2         try (FileWriter fw = new FileWriter("", true)) {
    3             fw.write(str);
    4         } catch (IOException e) {
    5             e.printStackTrace();
    6         }
    7     }

    APIドキュメントを表示することで、AutoCloseableで既知のすべてのインプリメンテーションクラスを表示できます.ここではFileWriterを例に挙げます.
  • FIleWriterをクリックし、内部実装を確認:
  • public class FileWriter extends OutputStreamWriter
  • OutputStreamWriterをクリックし、抽象クラスWriterを継承:
  • public class OutputStreamWriter extends Writer
  • Writerをクリックし、Closeableインタフェースを実現:
  • public abstract class Writer implements Appendable, Closeable, Flushable 
  • Closeableインタフェースをクリックし、内部実装を確認すると、このインタフェースがAutoCloseableインタフェースを継承していることがわかる(このインタフェースはclose()メソッドのみ):
  • public interface Closeable extends AutoCloseable

     
    まとめ:
  • AutoCloseableは1.7バージョンから導入;
  • AutoCloseableは1つの方法close()しかなく、異常を放出する.
  • AutoCloseableの自動シャットダウンを実現する:
  •     1.インタフェースはAutoCloseableインタフェース(またはクラス実装AutoCloseableインタフェース)を継承します.
        2.結合例外処理文:try()...catch()は自動クローズ処理を実現する.
       
    その他の結論:
      1.JDK1.7まではtryが一般的に使われていましたが...Catch()異常をキャプチャし、finally部分でIOストリームなどを閉じるが、JDK 1.7以降、Java 7のコンパイラと実行環境は新しいtry-with-resources文(ARMブロック、自動リソース管理)をサポートし、()に書かれたオブジェクトに対応するクラスは自動クローズインタフェースAutoCloseableを実現した.
      2.AutoCloseableインタフェースを実装するクラスのインスタンスは、tryの後(リソース付きtry文)に配置され、try(){}の終了時に自動的にこれらのリソースが閉じられます(close()メソッドを呼び出します).
      3.リソース付きtry文の3つのキー:
  • リソース付きtry文で管理されるリソースは、AutoCloseableインタフェースを実現したクラスのオブジェクトでなければならない.
  • try文で宣言されたリソースは暗黙的にfinalと宣言される.
  • 各宣言をセミコロンで区切って複数のリソースを管理できる.

  •  
    本文の一部の内容と結論は他の資料に基づいて整理・修正され、不適切な点があれば、伝言を残して訂正してください.