2009-03-26 10 views
5

Cでは+ リソース取得が初期化(RAII)パターンで、リソース管理が大幅に簡素化されています。この考え方は、あらゆる種類のリソースに対していくつかのラッピングオブジェクトを提供することです。ラッピングオブジェクトのデストラクタは、その範囲外になったときにリソースを解放する役割を担います。例:JavaではC++のようなリソース管理が可能です

{ 
    auto_ptr<int> smartPointer = new int; 
    // some other code 

} // the memory allocated for the int is released automatically 
    // by smartPointer's destructor 

最も一般的な使用法はスマートポインタです。しかし、他の多くの種類のリソース(ファイル、mutex、ソケットなど)がまったく同じ方法で管理できます。

Javaでは、メモリ管理を煩わせる必要はありません。しかし、他のすべてのタイプのリソースが残っています。 、最終的にはブロックですが、多くの異なる例外がスローされる可能性がある場合は、その使用法はかなり不便です。

私の質問は、C++ RAIIと同等の機能を提供するJavaパターンがあるかどうかです。そうでない場合は、この分野でのベストプラクティスを共有してください(洗練された方法を使用しない限り、最終的にではなく)。

+0

この質問を参照してください:http://stackoverflow.com/questions/194261/raii-in-java-is-resource-disposal-always-so-ugly-was-i-had-a-dream – Eclipse

+0

また:http ://stackoverflow.com/questions/477399/does-java-support-raii-deterministic-destruction – Eclipse

+0

"リソース管理を非常に簡素化する"あなたは私を驚かせていますか? – hasen

答えて

10

を参照してください。あるいは、Execute Around idiomでリソース処理を抽象化することもできます。

4

ジョシュア・ブロックは、プロジェクトコイン(JDK 7のための小さな言語の変更)の一環としてJavaへAutomatic Resource Managementと呼ばれる機構を追加する提案しました:

+0

これはtry/catch/finallyの単なる(有用な)構文的砂糖です。だから今日(2011年とは対照的に)何かをしたいのなら、try/catch/finallyについての答えを見てください。 –

+2

try/finallyはRAIIと比較してうまくいきます。元の質問は、JavaがRAIIに匹敵するものを持っていたかどうかでした。答えは、明らかに、いいえです。 –

1

を多くのプログラマーに、RAIIイディオムの強さは、基になるの人生ですリソースはスコープブロックに結びついているため、作成やメンテナンスが簡単になります。最終的にエラーが発生してそのリソースを解放できなくなります。

独自のスコープ境界構造を作成できないため、残念ながらJavaでこの動作を模倣することはできません。この問題を解決しようとしたのJavaに似た言語は、C#である:

// explicit release 
MyClass obj = MyClass(); 
obj.UseIt(); 
obj.Dispose(); 

// RAII-like (scope-bound) release 
using(MyClass obj = new MyClass()) 
{ 
    obj.UseIt(); 
} 

おそらく、我々は将来的に実装され、このような機能が表示されます。

+0

pythonはこれも 'with'構造体で追加しました – hasen

+0

これは当てはまりません。あなたは確かTom Hawtin - tacklineによって提案されたようにjavaでそれをシミュレートすることができます。 – kirakun

+0

@Kirakun: "それをシミュレートする";スコープ?私の額はちょうど1インチ伸びた。 –

関連する問題