Javaの7は怠惰なJava開発者のためのいくつかの非常に素晴らしい機能をもたらします。資源をしようとし、それは、コードをより堅牢に、コードの行数を減らすことができ、この機能の一つです。このチュートリアルでは、私は、この機能の内容を説明します。
1. クリアリソースの古い方法(Javaの7の前に)
**私たちは、このに長い時間を行ってきました。たとえば、ファイルシステムからファイルを読み込みます。コードは異なる場合がありますが、プロセスは、以下に例示します:
public class ResourceManagementBeforeJava7
{
public static void main(String[] args)
{
BufferedReader br = null;
try
{
String sCurrentLine;
br = new BufferedReader(new FileReader("C:/temp/test.txt"));
while ((sCurrentLine = br.readLine()) != null)
{
System.out.println(sCurrentLine);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (br != null)
br.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
コードのこれらのタイプは、アプリケーションのコードライブラリで非常に一般的であるIO操作の数が多いです。
これは、コードとのtry catchブロックの性質上、およびアプリケーション内の特定のロジックを持つことが重要です。しかし、最終的に彼はそれをブロック?ほとんどの場合、finallブロックは、単にコピー&ペーストされ、その目的は、そのリソースを閉じることにより、損傷を避けるためです。
あなたが単一でシャットダウンする3-4そのようなリソースを持っている場合は、最後に、ブロックの最終ブロック見た目より醜いです。私たちが知っているように、あなたはこれらの最後のブロックが不必要に存在し、私たちは、例外なしにどのような方法でリソースを閉じなければならないことだと思いませんか?
Javaの7は、try-と資源機能でこの問題を解決します。#
2.新しい試み-と、リソースを使用する方法(構文の例)
今のJava 7で開閉リソースへの新しい方法を見てください。
public class ResourceManagementInJava7
{
public static void main(String[] args)
{
try (BufferedReader br = new BufferedReader(new FileReader("C:/temp/test.txt")))
{
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null)
{
System.out.println(sCurrentLine);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
二つのことは、細心の注意を払う必要があります:
- tryブロック内のファイルリソース(小括弧内)特別な方法でオープン(BufferedReaderの)。
- 最終的には完全に姿を消したブロック。
少なくとも最後にではなく、そのコードルックスは非常に素晴らしく、読みやすいです。さて、右?しかし、それは実際に動作しますか?
3. 実際それがどのように動作しますか?
Javaの7では、私たちは、インターフェース新しいスーパー持っ ** java.lang.AutoCloseableを。インターフェースはメソッドがあります。
void close() throws Exception;
このインタフェースはJavaドキュメントを示唆して不要になったときに閉じていないしなければならないすべてのリソース上で実現します。
我々は特別なのtry-とリソースブロックにそのようなAutoCloseableリソースを開くと、tryブロックが完了した後、JVMは、内のすべてのリソースブロックを初期化する「()してみてください」します即時close()メソッドの呼び出し。
たとえば、BufferedReaderのは、ドキュメント、次のclose()メソッドを実現しました。
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
in.close();
in = null;
cb = null;
}
}
JVMは、このメソッドを呼び出すときに起因する上記の方法の定義に、リソースまたはIOのすべての基本的な流れは、閉じられます。
カスタムリソースに機能を追加4.
まあ、これはデザインをクリーンアップするための素晴らしいリソースです。しかし、それだけで行うネイティブJDKクラスに適用されますか?いいえ。また、カスタムリソースのためにそれを使用することができます。
例えば、私は次のコードでカスタムリソースを作成しました:
public class CustomResource implements AutoCloseable
{
public void accessResource() {
System.out.println("Accessing the resource");
}
@Override
public void close() throws Exception {
System.out.println("CustomResource closed automatically");
}
}
今、私は、サンプルコードでそれを使用します:
public class TryWithCustomResource
{
public static void main(String[] args)
{
try(CustomResource cr = new CustomResource())
{
cr.accessResource();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Putput in console:
Accessing the resource
CustomResource closed automatically
出力コンソールは、明確にtryブロックが完了した後、リソースが自動的にシャットダウンします、ということを示しています。
5.まとめ
これは、自動リソース管理のtry--リソースとの内容全体を使用してJava 7で行われます。私たちは、ポイント・ノートで重要な要素を指してみましょう:
- Javaの7の前に、我々は最終的にリソースをクリーンアップするためにブロックを使用する必要があります。最後に、ブロックは必須ではありませんが、システムの損傷を防止するために、クリーンアップのリソース。
- 明示的にクリーンアップをリソースせずに使用するJava 7、。それは自動的に行われます。
- ({...}試みる(...))のtry-WITH-リソースブロック初期化リソース内のリソースの自動的なクリーンアップを完了する。
- 新しいインターフェイスAutoCloseableが起こるので、とてもクリーンアップが行われました。tryブロックの終了後、JVMは、そのすぐ近くにメソッドを呼び出します。
- カスタムリソースでこの機能を使用する場合は、AutoCloseableインタフェースを実装する必要があります。そうしないとプログラムがコンパイルされません。
- あなたは、コード内のclose()メソッドを呼び出してはいけません。JVMが自動的に呼び出されなければなりません。手動では、それが予期しない結果につながる可能性が起動します。
幸せな学習!