質問

いくつかの 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 を実装する必要があります。公式ドキュメント

Javaチェックアウトの古いバージョンの場合この回答およびこの回答

言語内で最も近いものは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;です。キーワード。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top