6

In C++ we acquiring a resource in a constructor and release it in a destructor.

So when an exception rises in a middle of a function there will be no resource leak or locked mutexes or whatever.

AFAIK java classes don't have destructors. So how does one do the resource management in Java.

For example:

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

How can one release resource if DoSomething throws an exception? We can't put try\catch blocks all over the code, can we?

4

5 に答える 5

4

この質問は 2008 年にさかのぼるため、Java 6 に関連しています。それ以来、自動リソース管理の新機能を含む Java 7 がリリースされました。Java 7 に関連する最近の質問については、次の質問を参照してください。

自動リソース解放のためのJavaテクニック? 「迅速なクリーンアップ」?

于 2011-10-23T13:15:43.040 に答える
4

Yes you can and should put try/catch/finally block around your code. In C# there is a shorthand "using" statement, but in Java you are stuck with:

public int foo() {
    Resource f = new Resource();
    try {
        DoSomething(f);
    }
    finally {
        f.Release();
    }
}
于 2008-09-12T09:27:57.007 に答える
2

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 を使用すると、ステートメントを実行し、結果をループして、リソースを閉じ、例外をラップできます。

于 2008-09-12T12:28:25.107 に答える
0

using ブロックが必要な場合は、Java クロージャーの議論に参加してください:S

于 2008-09-12T09:35:12.620 に答える
-1

がっかりさせて申し訳ありませんが、Java では多くの try\catch\finally ブロックを使用します。そして、「たくさん」とは、たくさんのことを意味します。Java に C# の using ブロックがあればいいのにと思うことがあります。ほとんどの場合、リソースを解放する必要はありません。これは、Java のガベージ コレクターが処理してくれるからです。

ただし、例外には、エラー処理をよりクリーンにする用途があります。独自の例外を作成し、何をしていても例外をキャッチできます。ユーザーに任意のエラー コードを返す必要はもうありません。

于 2008-09-12T09:45:59.037 に答える