Javaは、使用して、リソースのtry-ではなく、試して、最終的に優先順位を与えてください

IMG

Javaは、使用して、リソースのtry-ではなく、試して、最終的に優先順位を与えてください

Javaライブラリは、リソースを閉じるには、Closeメソッドを呼び出すためのマニュアルの必要性が多く含まれています。例えば、のInputStream、OutputStreamの、とのjava.sql.Connection。閉じるリソースは、しばしばひどいパフォーマンスの問題につながることができ、クライアント、見落とし。多くのリソースは、安全ネットターミネータ、ターミネータとして使用するが、それはとても満足のいくものではないが。

歴史的な観点からは、のtry-finallyステートメントは、リソースが適切に閉じられていることを確認するための最良の方法である、それも例外またはreturn文の顔でも同様です。

// try-finally - No longer the best way to close resources!

static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try {

      return br.readLine();

    } finally {

      br.close();

    }

}

それはかなり良いように見えますが、あなたは2番目のリソースを追加するとき、状況は少し悪くなったときに:

// try-finally is ugly when used with more than one resource!

  static void copy(String src, String dst) throws IOException {

    InputStream in = new FileInputStream(src);

    try {

      OutputStream out = new FileOutputStream(dst);

      try {

        byte[] buf = new byte[BUFFER_SIZE];

        int n;

        while ((n = in.read(buf)) >= 0)

          out.write(buf, 0, n);

      } finally {

        out.close();

      }

    } finally {

      in.close();

} 

}

信じがたいが、それでも良いプログラマは、多くの場合、このようなコードを書きますが。手始めに、私は[Bloch05] 88ページ上のJavaのpuzzlersの問題点を指摘したが、年間、誰も気づいていません。実際には、2007年には、Javaライブラリで3分の2がcloseメソッドを使用して間違っています。

でも、使ってみて、最終的に文は適切なコードリソース(例えば、前の2つのコード例を)閉じて、いくつかのマイナーな問題があります。例外を投げることができるブロックとfinallyブロックのコードを試してみてください。例えば、firstLineOfFile法では、基礎となる物理デバイスの故障以来、のreadLineは近いが、同じ理由で失敗します呼び出し、例外をスローする可能性があります呼び出します。これらのケースでは、2番目の例外は、完全に最初に出て隠してしまいます。最初のレコードが大幅に実際のシステムの試運転の複雑さを増加させる情報の例外スタック内の例外ではない - 一般的に言って、重要な問題は、第1の異常診断です。最初の例外情報を保持し、書き込みコードによって、第2の例外を抑制することが可能であるが、誰がそれを行うことないだろうが、あまりにも面倒ため。

Javaの7のtry-と資源の文の導入により、これらの問題のすべてが解決された[JLS、14.20.3] この構造を使用するには、必要なリソースは、この方法の唯一の近い空戻り値の型が含まれているAutoCloseableインターフェイスを実装します。サードパーティのライブラリと多くのライブラリのJavaクラスとインターフェースは今達成またはAutoCloseableを継承しています。あなたは、リソースを表すために使用するクラスを記述する場合、それは閉じなければならない、そしてこのクラスはAutoCloseableを実装する必要があります。

上記の最初の例を書き直すのtry-で、リソース次のコードを使用します:

// try-with-resources - the the best way to close resources!

  static String firstLineOfFile(String path) throws IOException {

    try (BufferedReader br = new BufferedReader(

        new FileReader(path))) {

      return br.readLine();

}

}

次のコードのtry-と資源第二の例上記の書き換えを使用します:

// try-with-resources on multiple resources - short and sweet

  static void copy(String src, String dst) throws IOException {

    try (InputStream  in = new FileInputStream(src);

 OutputStream out = new FileOutputStream(dst)) {

byte[] buf = new byte[BUFFER_SIZE];

int n;

while ((n = in.read(buf)) >= 0)

  out.write(buf, 0, n);

  } 

}

バージョンより良いコードだけより簡潔かつオリジナルよりも読みやすいと資源-しようとするだけでなく、より良い問題を診断する機能を提供します。firstLineOfFile方法を考えてみましょう。あなたがのreadLineを呼び出す場合(見えない)closeメソッドが例外をスローし、その後、後者の例外は抑制元になります。実際には、複数の例外は、このようにあなたが実際に見たい異常を保存し、抑制されます。彼らは、スタックに印刷され、それらが抑制されることを対応するシンボル、これらの異常は、破棄される押されていません。また、Java 7人の中でのThrowableに追加されるgetSuppressed法により、プログラムでこれらの例外にアクセスすることができます。

あなただけの正規のtry-finally文のように、のtry-と資源文の句プットをキャッチすることができます。これは意志と例外を処理している間に、別のネストレベルでコードを邪魔しません。たとえば、次のメソッドの例外スローfirstLineOfFileバージョンではありませんが、ファイルを開くことができないか、ファイルを読み取ることができないならば、それはリターンにデフォルト値を受け取ります。

// try-with-resources with a catch clause

  static String firstLineOfFile(String path, String defaultVal) {

    try (BufferedReader br = new BufferedReader(

        new FileReader(path))) {

      return br.readLine();

    } catch (IOException e) {

      return defaultVal;

} 

}

リソースを扱うときに明らかに、クローズする必要があり、試して、最終的にではなく、試し-と、リソースを使用する優先権を与えてください。それが生成するコード短く、明確に、より便利な異常もの結果。コードを書くのtry-と資源の文になり、より容易にリソースをオフにするために使用されている必要があり、これは、try-ようやくできないです。


お問い合わせの際出典:のInputStream / BufferReader、これらのクラスはAutoClosedクラスを実現するために達成されています。

ビッグベビー概要:

finally文今日の利便性を体験するには、2つの試みがまだある昨日独自のプログラムを書くために、可能な限りこの構文を使用します。

トライでリソースの構文:

試してみる(ここでクローズするリソースのリソース定義){

関連の操作は、ここに書きます

}

おすすめ

転載: www.cnblogs.com/bigbaby/p/12556613.html