Javaには、休止状態でセッションを開くときに使用できるusingステートメントがありますか?
C# では次のようになります。
using (var session = new Session())
{
}
したがって、オブジェクトはスコープ外になり、自動的に閉じます。
Javaには、休止状態でセッションを開くときに使用できるusingステートメントがありますか?
C# では次のようになります。
using (var session = new Session())
{
}
したがって、オブジェクトはスコープ外になり、自動的に閉じます。
Java 7は、この機能をJavaプラットフォームにもたらす自動リソースブロック管理を導入しました。以前のバージョンのJavaには、に似たものはありませんでしたusing
。
java.lang.AutoCloseable
例として、次の方法で実装する任意の変数を使用できます。
try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
...
}
java.io.Closeable
ストリームによって実装されるJavaのインターフェースは自動的に拡張されるため、C#ブロックで使用するのと同じようAutoCloseable
に、ブロックでストリームを使用できます。これはC#と同等です。try
using
using
バージョン5.0以降、Hibernate Sessionsは実装さAutoCloseable
れ、ARMブロックで自動クローズできます。以前のバージョンのHibernateSessionはを実装していませんでしたAutoCloseable
。したがって、この機能を使用するには、Hibernate>=5.0である必要があります。
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
}
しかし、それはおそらくあなたが意図したものではありません。
Java 7 以降: http://blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec
問題のコードの構文は次のようになります。
try (Session session = new Session())
{
// do stuff
}
またはその(多くの)サブインターフェースの1つSession
を実装する必要があることに注意してください。AutoClosable
技術的に:
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.
}
今のところ、ありません。
ただし、ARM forJava7の提案があります。
リソース管理に関心がある場合は、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にはusing
同等のステートメントはありません。
このJava キーワードのリスト を参照してください。
using
キーワードはリストに含まれていません。using
また、Java では現在のところ、C# のキーワードと他のキーワードとの同等性はありません。"using"
このような動作を模倣try...catch...finally
するには、 内のリソースを破棄するブロックを使用する必要がありますfinally
。
プロジェクト コインのARM ブロックはJava 7 になります。これは、構文を使用して .Net と同様の機能を Java にもたらすことを目的とした機能です。
変数を自動的に閉じる/破棄することについて話す代わりに、変数のスコープを制限することに関する質問に答える。
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);
}