Javaは、休止状態でセッションを開くときに使用できるusingステートメントを持っていますか?
C#では、次のようなものです。
using (var session = new Session())
{
}
そのため、オブジェクトは範囲外になり、自動的に閉じます。
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である必要があります特徴。
前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
}
_
しかし、それはおそらくあなたが意図したものではありません。
Java 7の場合: http://blogs.Oracle.com/darcy/entry/project_coin_updated_arm_spec
質問のコードの構文は次のとおりです。
try (Session session = new Session())
{
// do stuff
}
Session
は AutoClosable
またはその(多くの)サブインターフェースの1つを実装する必要があることに注意してください。
技術的に:
DisposableObject d = null;
try {
d = new DisposableObject();
}
finally {
if (d != null) {
d.Dispose();
}
}
最も近いJava同等のものは
AwesomeClass hooray = new AwesomeClass();
try{
// Great code
} finally {
hooray.dispose(); // or .close(), etc.
}
いいえ、Javaには同等のusing
ステートメントがありません。
今のところ、いいえ。
ただし、 [〜#〜] arm [〜#〜] for Java 7。
リソース管理に興味がある場合、 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);
}
}
}
_
Java 8を使用できます。次のページを参照してください。 http://docs.Oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html =
こちらをご覧ください List of Java Keywords) 。
using
キーワードは、残念ながらリストの一部ではありません。using
キーワードの同等性はありません。そのような"using"
動作を模倣するには、try...catch...finally
ブロックを使用する必要があります。このブロックでは、finally
内のリソースを破棄します。
変数を自動的に閉じる/破棄するのではなく、変数のスコープを制限することに関する質問に答えるため。
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);
}