Javaには、休止状態でセッションを開くときに使用できるusingステートメントがありますか?
C#では次のようになります。
using (var session = new Session())
{
}
そのため、オブジェクトはスコープ外になり、自動的に閉じます。
using statement
。
using
自動的に破棄しますが、オブジェクトの割り当てを解除しません。すべての参照が消えるまで、オブジェクトの寿命は終了しません。
Javaには、休止状態でセッションを開くときに使用できるusingステートメントがありますか?
C#では次のようになります。
using (var session = new Session())
{
}
そのため、オブジェクトはスコープ外になり、自動的に閉じます。
using statement
。
using
自動的に破棄しますが、オブジェクトの割り当てを解除しません。すべての参照が消えるまで、オブジェクトの寿命は終了しません。
回答:
Java 7 では、この機能をJavaプラットフォームにもたらす自動リソースブロック管理が導入されました。以前のバージョンのJavaには類似点はありませんでしたusing
。
例として、java.lang.AutoCloseable
次の方法で実装する任意の変数を使用できます。
try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
...
}
java.io.Closeable
ストリームによって実装されるJavaのインターフェースは自動的に拡張されるAutoCloseable
ためtry
、C#using
ブロックで使用するのと同じように、ブロックでストリームを既に使用できます。これはC#と同等using
です。
以下のようにバージョン5.0、休止セッションが実装AutoCloseable
とARMブロックで自動閉鎖することができます。以前のバージョンのHibernate SessionAutoCloseable
では、は実装されていませんでした。したがって、この機能を使用するには、Hibernate> = 5.0を使用する必要があります。
using
行います)。
AutoCloseable
ため、まだARMを使用できません。
AutoCloseable
Java 7以前は存在しませんでしたか?
Java 7以前は、Javaにそのような機能はありませんでした(Java 7以降については、ARMに関するAsaphの回答を参照してください))。
あなたはそれを手動で行う必要があり、それは苦痛でした:
AwesomeClass hooray = null;
try {
hooray = new AwesomeClass();
// Great code
} finally {
if (hooray!=null) {
hooray.close();
}
}
そしてそれはどちら// Great code
でもないときの単なるコードですhooray.close()
、例外スローできです。
あなたがいる場合、実際にのみ、変数の範囲を制限したい場合、単純なコードブロックは、仕事をしていません。
{
AwesomeClass hooray = new AwesomeClass();
// Great code
}
しかし、それはおそらくあなたが意図したものではありません。
// Great code
例外がスローされても、Javaの同等の機能で問題はないはずです。
horray
その時点で初期化されていない可能性があるため、実際には私の例はコンパイルされません(現在修正済み)。
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.
}
リソース管理に関心がある場合は、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では、tryを使用できます。下記ページをご参照ください。http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
このJavaキーワードのリストを参照してください。
using
キーワードは、残念ながら、リストの一部ではありません。using
、現在のJavaのように、他のキーワードによるC#キーワードの同等性もありません。このような"using"
動作を模倣するには、try...catch...finally
ブロックを使用する必要がありますfinally
。このブロックでは、内のリソースを破棄します。
using
のキーワードではない事を意味するものではありません。@BalusCが言及したように、同じ機能を別のキーワードで実装できます(実装されます!)。
using
、Javaキーワードのリストに含まれていないという事実は、この機能がJava言語に存在しないことを意味すると言っているようです。そして、それは真実ではありません。
using
キーワードはなく、同等もないように私の回答を編集しました。@Joachim Sauerに感謝します!=)
変数を自動的に閉じる/破棄するのではなく、変数のスコープの制限に関する質問に答えます。
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("andygreen@gmail.com");
users.add(user);
}
{
User user = new User();
user.setId(1);
user.setName("Rachel Blue");
user.setEmail("rachelblue@gmail.com");
users.add(user);
}
using
はありません。スコープは(と寿命ではないusing
として、厳密に言えば、どちらかの寿命に関するものではありませんDispose
、オブジェクトのメモリを破壊しない。)