そのため、Java 7 にはクラスを自動的に閉じる気の利いた機能がありますAutoCloseable
。Bar
実装Closeable
(これは を拡張します) があり、からAutoCloseable
オープンを取得する方法がある場合、これを行うことができます。Bar
Foo
try(Bar bar=foo.openBar())
//do something
}
...そして、句bar
に入れられたかのように、自動的に閉じられます。finally
素晴らしい。
Bar
しかし、 を取得して後で開きたい場合はどうすればよいでしょうか。おそらく aBar
は a に似ていてFile
、単にリソースを識別するためです。それらの多くを識別したい場合がありますが、必要な場合にのみ開きます。
Bar bar=foo.getBar();
try(bar.open()) //doesn't work
//do something
}
try
しかし、Java 7 の自動管理アプローチでは、句で変数を割り当てる必要がありますよね?
だから多分私は賢くてBar.open()
リターンthis
(つまりBar
インスタンス)を持つことができるので、これを行うことができます:
try(Bar bar=foo.getBar().open())
//do something
}
これは私が望むように機能しますが、中間Bar
インスタンスが閉じられないという警告が表示されます。
だから多分私はこれを行うことができます:
Bar bar=foo.getBar();
try(Bar temp=bar.open())
//do something
}
これも私が望むように機能しますが、醜いだけでなく、まだ警告が表示されます---今回は最初のbar
変数が決して閉じられません.
したがって、次のbar.open()
ように、保護されたブロック内に呼び出しを配置できます。
try(Bar bar=foo.getBar())
bar.open();
//do something
}
それは私が望むように動作します---ほとんどの場合。しかしbar.open()
、例外がスローされた場合はどうなるでしょうか。Java 7 は を閉じようとしますbar
が、私の実装では、IllegalStateException
一度も開かれていないものを閉じることができないため、これがスローされます。そして、そうあるべきですよね?インスタンスが開かれる前に誰かがそのBar
インスタンスを閉じようとすると、何かがおかしいので、問題が伝播して未知の時期に表面化するのではなく、フェイルファーストのアプローチが必要だからです。
でも、本当は自動リソース管理を使いたいのかもしれないBar.close()
ので、Bar
. しかし、今私が何をしているのか見てみましょう: 構文コンパイラ シュガーを使用するためだけに API を変更しています (おそらく劣ったものにしています)。
他のアイデアはありますか?Java 7 がリソースを自動的に閉じるように Java 7 自動リソース管理を使用したいのですが、いつ開くかを決定したいと考えています。