2008-09-12 10 views
6

C++では、コンストラクタでリソースを取得してデストラクタで解放します。Javaでの徹底したリソース管理

したがって、関数の途中で例外が発生した場合、リソースリークやロックミューテックスなどはありません。

AFAIK Javaクラスにはデストラクタがありません。では、Javaでリソース管理をどのように行うのでしょうか。例えば

:doSomethingのが例外をスローした場合

public int foo() {  
    Resource f = new Resource(); 
    DoSomething(f); 
    f.Release(); 
} 

どのようにして、リソースを解放することができますか? try \ catchブロックをコードの上に置くことはできません。

答えて

4

はい、try/catch/finallyをコードの周りに置くことができます。 C#では声明「を使用して」速記がありますが、Javaでは、あなたがで立ち往生している:

public int foo() { 
    Resource f = new Resource(); 
    try { 
     DoSomething(f); 
    } 
    finally { 
     f.Release(); 
    } 
} 
0

あなたが使用してブロックがJavaのクロージャの議論に巻き込またい場合:S

+0

:Javaの7に関連して、より最近の質問はこの質問を参照してください? – Spoike

+0

インターネット上のすべて: http://www.google.dk/search?q=java+closures – svrist

-1

あなたを失望させ申し訳ありませんが、 Javaの場合do try \ catch \ finallyは多くのブロックを使用します。そして「たくさん」とは、A LOTを意味します。私は、JavaがC#usingブロックを持っていることを時々望んでいます。たいていの場合、Javaのガベージコレクタがリソースを解放するためにリソースを解放する必要はありません。

しかし例外は、エラー処理をよりきれいにするために使用されています。あなたはあなた自身の例外を書いて、あなたが何をしているのかに気づくことができます。ユーザーに任意のエラーコードを返すことはもうありません!

+1

はい!それらを醜い混乱しているスタックトレースに戻してみましょう! –

+0

ああ、-429321313エラーコードダイアログではなく、NullPointerExceptionを取得する不思議。 –

+1

Java 7には、「リソース管理」機能があります。これは、特別な形式の 'try'ブロックを使用すると、すべてのCloseableリソースを閉じる機能です。 –

3

Execute aroundイディオムを使用してtry/finally(および例外とアルゴリズム)を除外することは可能です。ただし、構文は非常に冗長です。

public int foo() { 
    withResource(new WithResource() { public void run(Resource resource) { 
     doSomething(resource); 
    }}); 
} 

... 

public interface WithResource { 
    void run(Resource resource); 
} 

public static void withResource(WithResource handler) { 
    Resource resource = new Resource(); 
    try { 
     handler.run(resource); 
    } finally { 
     resource.release(); 
    } 
} 

このようなことは、try/finally以上に抽象化していると意味があります。たとえば、JDBCを使用すると、文を実行し、結果をループし、リソースを閉じて例外をラップすることができます。

+0

with(new Resource(){public void do(Resource resource)....)は少し良くなります。:-) –

+2

それはありますが、それは複数の方法で間違っています。 ;) –

関連する問題