web-dev-qa-db-ja.com

Java usingステートメントはありますか?

Javaは、休止状態でセッションを開くときに使用できるusingステートメントを持っていますか?

C#では、次のようなものです。

using (var session = new Session())
{


}

そのため、オブジェクトは範囲外になり、自動的に閉じます。

92
mrblah

Java 7で導入された Automatic Resource Block Management は、この機能をJavaプラットフォームに提供します。以前のバージョンのJavaにはusingに似たものはありませんでした。

例として、次の方法でJava.lang.AutoCloseableを実装する任意の変数を使用できます。

try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
    ...
}

ストリームによって実装されるJavaのJava.io.Closeableインターフェイスは、自動的にAutoCloseableを拡張するため、C#tryブロックで使用するのと同じ方法でusingブロックで既にストリームを使用できます。 。これは、C#のusingと同等です。

バージョン5.0以降、Hibernate SessionsはAutoCloseable を実装し、ARMブロックで自動的に閉じることができます。以前のバージョンのHibernate SessionはAutoCloseable を実装していませんでした。したがって、これを使用するにはHibernate> = 5.0である必要があります特徴。

110
Asaph

前Java 7)、noJava(for Java 7以降は Asaph 's answer に関する[〜#〜] arm [〜#〜])。

あなたはそれを手動で行う必要があり、それは痛みでした

_AwesomeClass hooray = null;
try {
  hooray = new AwesomeClass();
  // Great code
} finally {
  if (hooray!=null) {
    hooray.close();
  }
}
_

そして、それは_// Great code_もhooray.close()も例外をスローできない場合のコードです。

really変数のスコープのみを制限したい場合、単純なコードブロックが仕事をします:

_{
  AwesomeClass hooray = new AwesomeClass();
  // Great code
}
_

しかし、それはおそらくあなたが意図したものではありません。

28
Joachim Sauer

Java 7の場合: http://blogs.Oracle.com/darcy/entry/project_coin_updated_arm_spec

質問のコードの構文は次のとおりです。

try (Session session = new Session())
{
  // do stuff
}

SessionAutoClosable またはその(多くの)サブインターフェースの1つを実装する必要があることに注意してください。

17
riwi

技術的に:

DisposableObject d = null;
try {
    d = new DisposableObject(); 
}
finally {
    if (d != null) {
        d.Dispose();
    }
}
8
ChaosPandion

最も近いJava同等のものは

AwesomeClass hooray = new AwesomeClass();
try{
    // Great code
} finally {
    hooray.dispose(); // or .close(), etc.
}
8

いいえ、Javaには同等のusingステートメントがありません。

3
Rich Adams

今のところ、いいえ。

ただし、 [〜#〜] arm [〜#〜] for Java 7。

3
missingfaktor

リソース管理に興味がある場合、 Project Lombok_@Cleanup_ アノテーションを提供します。サイトから直接取得:

_@Cleanup_を使用して、コード実行パスが現在のスコープを終了する前に特定のリソースが自動的にクリーンアップされるようにすることができます。これを行うには、ローカル変数宣言に_@Cleanup_注釈を付けます:

@Cleanup InputStream in = new FileInputStream("some/file");

その結果、現在のスコープの最後で、in.close()が呼び出されます。この呼び出しは、try/finallyコンストラクトによって実行されることが保証されています。以下の例を見て、これがどのように機能するかを確認してください。

クリーンアップするオブジェクトのタイプにclose()メソッドがなく、他の引数のないメソッドがある場合、このメソッドの名前を次のように指定できます。

@Cleanup("dispose") org.Eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);

デフォルトでは、クリーンアップメソッドはclose()であると想定されています。引数を取るクリーンアップメソッドを_@Cleanup_経由で呼び出すことはできません。

バニラジャワ

_import Java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        out.close();
      }
    } finally {
      in.close();
    }
  }
}
_

ロンボクあり

_import lombok.Cleanup;
import Java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    @Cleanup InputStream in = new FileInputStream(args[0]);
    @Cleanup OutputStream out = new FileOutputStream(args[1]);
    byte[] b = new byte[10000];
    while (true) {
      int r = in.read(b);
      if (r == -1) break;
      out.write(b, 0, r);
    }
  }
}
_
2
Adam Paynter

Java 8を使用できます。次のページを参照してください。 http://docs.Oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html =

2
user232343

こちらをご覧ください List of Java Keywords)

  1. usingキーワードは、残念ながらリストの一部ではありません。
  2. また、現在のJavaでは、他のキーワードとC#usingキーワードの同等性はありません。

そのような"using"動作を模倣するには、try...catch...finallyブロックを使用する必要があります。このブロックでは、finally内のリソースを破棄します。

1

ARMブロック 、from プロジェクトコイン はJava 7.にあります。これは、同様の機能をJava構文を使用した.Netとして。

1
krock

変数を自動的に閉じる/破棄するのではなく、変数のスコープを制限することに関する質問に答えるため。

Javaでは、中括弧を使用して閉じた匿名スコープを定義できます。これは非常に簡単です。

{
   AwesomeClass hooray = new AwesomeClass()
   // Great code
}

変数hoorayは、このスコープ内でのみ使用でき、外部では使用できません。

これは、一時的な繰り返し変数がある場合に便利です。

たとえば、それぞれにインデックスがあります。 item変数がforループで閉じられているように(つまり、その内部でのみ使用可能です)、index変数は匿名スコープで閉じられます。

// first loop
{
    Integer index = -1;
    for (Object item : things) {index += 1;
        // ... item, index
    }
}

// second loop
{
    Integer index = -1;
    for (Object item : stuff) {index += 1;
        // ... item, index
    }
}

また、変数スコープを提供するためのforループはないが、汎用変数名を使用したい場合にも、これを使用します。

{
    User user = new User();
    user.setId(0);
    user.setName("Andy Green");
    user.setEmail("[email protected]");
    users.add(user);
}

{
    User user = new User();
    user.setId(1);
    user.setName("Rachel Blue");
    user.setEmail("[email protected]");
    users.add(user);
}
0
Alex