質問
いくつかの C# で投稿された質問で、「using」句への参照が見られました。Javaには同等のものがありますか?
解決
はい。 Java 1.7では、 try-with-resources 構造が導入され、次のことが可能になりました。書く:
try(InputStream is1 = new FileInputStream("/tmp/foo");
InputStream is2 = new FileInputStream("/tmp/bar")) {
/* do stuff with is1 and is2 */
}
... using
ステートメントのように。
残念ながら、Java 1.7より前は、Javaプログラマーはtry {...}を最後に{...}を使用せざるを得ませんでした。 Java 1.6の場合:
InputStream is1 = new FileInputStream("/tmp/foo");
try{
InputStream is2 = new FileInputStream("/tmp/bar");
try{
/* do stuff with is1 and is 2 */
} finally {
is2.close();
}
} finally {
is1.close();
}
他のヒント
はい、Java 7では書き直すことができるので:
InputStream is1 = new FileInputStream("/tmp/foo");
try{
InputStream is2 = new FileInputStream("/tmp/bar");
try{
/* do stuff with is1 and is2 */
} finally {
is2.close();
}
} finally {
is1.close();
}
As
try(InputStream is1 = new FileInputStream("/tmp/foo");
InputStream is2 = new FileInputStream("/tmp/bar")) {
/* do stuff with is1 and is2 */
}
tryステートメントにパラメーターとして渡されるオブジェクトは、 java.lang.AutoCloseable
を実装する必要があります。公式ドキュメント。
言語内で最も近いものはtry-finallyを使用することです。
using (InputStream in as FileInputStream("myfile")) {
... use in ...
}
なる
final InputStream in = FileInputStream("myfile");
try {
... use in ...
} finally {
in.close();
}
一般形式は常に次のとおりです。
acquire;
try {
use;
} finally {
release;
}
取得がtryブロック内にある場合、取得が失敗した場合に解放します。場合によっては、不必要なコードでハッキングすることもできます(通常、上記の例ではnullをテストします)が、たとえば、ReentrantLockの悪いことが起こる場合があります。
同じことを頻繁に行っている場合は、「execute around」を使用できます。イディオム。残念ながら、Javaの構文は冗長であるため、多くのボイラープレートがあります。
fileInput("myfile", new FileInput<Void>() {
public Void read(InputStream in) throws IOException {
... use in ...
return null;
}
});
where
public static <T> T fileInput(FileInput<T> handler) throws IOException {
final InputStream in = FileInputStream("myfile");
try {
handler.read(in);
} finally {
in.close();
}
}
より複雑な例は、たとえば、例外をラップします。
私が知っていることではありません。 try ... finallyブロックでいくらかシミュレートできますが、それでもまったく同じではありません。
Javaで最も近いものはtry / finallyです。また、Javaは暗黙的な使い捨てタイプを提供しません。
C#:usingブロックの外側の変数のスコープ
public class X : System.IDisposable {
public void Dispose() {
System.Console.WriteLine("dispose");
}
private static void Demo() {
X x = new X();
using(x) {
int i = 1;
i = i/0;
}
}
public static void Main(System.String[] args) {
try {
Demo();
} catch (System.DivideByZeroException) {}
}
}
Java:ブロック外の変数のスコープ
public class X {
public void dispose() {
System.out.println("dispose");
}
private static void demo() {
X x = new X();
try {
int i = 1 / 0;
} finally {
x.dispose();
}
}
public static void main(String[] args) {
try {
demo();
} catch(ArithmeticException e) {}
}
}
C#:ブロック内の変数のスコープ
public class X : System.IDisposable {
public void Dispose() {
System.Console.WriteLine("dispose");
}
private static void Demo() {
using(X x = new X()) {
int i = 1;
i = i/0;
}
}
public static void Main(System.String[] args) {
try {
Demo();
} catch (System.DivideByZeroException) {}
}
}
Java:ブロック内の変数のスコープ
public class X {
public void dispose() {
System.out.println("dispose");
}
private static void demo() {
{
X x = new X();
try {
int i = 1 / 0;
} finally {
x.dispose();
}
}
}
public static void main(String[] args) {
try {
demo();
} catch(ArithmeticException e) {}
}
}
長い時間がかかりましたが、Java 7 では、 try-with-resources ステートメント とともに追加されました 自動クローズ可能 インターフェース。
「使用」に似た何かを達成できると思います。ブロック、匿名内部クラスを実装します。 Springが「Daoテンプレート」で行うように。
まあ、とにかくJavaの仲間は汗をかかないように、とにかく構文糖でした。
JavaでBGGAクロージャを取得すると、Javaの同様の構造でもこれが開かれます。 Gafterは、この例をスライドで使用しています。たとえば、次のとおりです。
withLock(lock) { //closure }
最初の例でほとんどのプログラマーが使用する実際のイディオムは次のとおりです。
InputStream is1 = null;
InputStream is2 = null;
try{
is1 = new FileInputStream("/tmp/bar");
is2 = new FileInputStream("/tmp/foo");
/* do stuff with is1 and is 2 */
} finally {
if (is1 != null) {
is1.close();
}
if (is2 != null) {
is2.close();
}
}
このイディオムを使用するとインデントが少なくなり、クリーンアップするリソースが2つを超えるとさらに重要になります。
また、必要に応じて新しいFileStream()が例外をスローすることを処理するcatch句を構造に追加できます。最初の例では、これを行うには別の囲むtry / catchブロックが必要になります。
ありません。
次のことができます
public void func(){
{
ArrayList l = new ArrayList();
}
System.out.println("Hello");
}
これにより、using句の範囲が制限されますが、ファイナライズコードを呼び出すIDisposableインターフェイスはありません。 try {} catch(){} Finally {}を使用できますが、使用する砂糖はありません。ちなみに、Javaでファイナライザを使用することは一般的に悪い考えです。
いいえ、Javaでの使用はありません。最も類似した機能は&quot; import&quot;です。キーワード。