17

Java7のtry-with-resourcesはすばらしいものですが、tryステートメントにリソースの宣言を含める必要がある理由について頭を悩ませることはできません。私の腸は、次のことが可能であるはずだと言っています:

CloseableResource thing;
try (thing = methodThatCreatesAThingAndDoesSomeSideEffect()) {
    // do some interesting things
}
thing.collectSomeStats();

残念ながら、これにより構文エラーが発生します(暗号的には;)。タイプ定義/宣言をtryステートメントに移動すると機能します。もちろん、対応するスコープに移動します。閉じられるよりも多くのものが必要な場合に、これを回避する方法を理解できます。コンパイラがこのように要求する理由AutoClosableに興味があります。

4

3 に答える 3

7

あなたのバージョンは、たとえば、何を閉じるべきかを明確に定義していません

CloseableResource thing;
Parameter a;

try (a = (thing = methodThatCreatesAThingAndDoesSomeSideEffect()).getParameter()) {

また、あなたが書いたらどうしますか

try (12) {

か何か?

また

CloseableResource thing1 = methodThatCreatesAThingAndDoesSomeSideEffect();
CloseableResource thing2 = methodThatCreatesAThingAndDoesSomeSideEffect();

try(thing1) {
}

なぜ閉じるだけthing1ですか?

したがって、現在の構文では、close ブロックを開くと同時に変数を作成する必要があります。

また2

CloseableResource thing1 = methodThatCreatesAThingAndDoesSomeSideEffect();

try(thing1) {
}

thing1.doSomethingOnClosedResource();

thing1残っているので。

于 2012-12-12T09:24:52.833 に答える