2017-03-17 9 views
0

先頭に戻る:私は今、JavaをやっているC#の男です。これらの不満の中には、私がJavaの知識が不足しているものがあります。AutoCloseableからヌズランスを取り除く

最初に、Exceptionを確認する必要のない「安全な」AutoCloseableの実装方法がありますか? closeメソッドからスローされない自分のクラスを含めるなら、なぜ私はそれをチェックしなければならないのかわかりません。

第2に、何が返されるのか気にしないtryステートメントの式を単純化する方法はありますか?私は

try (getAutoCloseable()) { 
    // yay! 
} 
へのJavaを簡素化することができることを望む

try (AutoCloseable iDontCare = getAutoCloseable()) { 
    // dont you dare use iDontCare 
} 

using (new Disposable()) 
{ 
    // yay! 
} 

とJavaは、一時変数に代入するために私を強制するようだ:たとえばC#で、私はこれを行うことができます

+0

@lucasvw私はコードを簡素化したいだけです。内部的にその状態を維持する。 C#ではこのパターンを使用してコードブロックの範囲をトレースします。完了したら、内部コードがスローされたかどうかにかかわらず、自動的に "ポップ"します。 –

+1

私は単純化されたJavaが何をするのかよく分かりません。変数に代入しない場合は、tryブロックで使用することはできません。したがって、tryブロックに例外がスローされた場合は、その変数を閉じる必要はありません。 – lucasvw

+0

'try {} catch {}'ブロックをオブジェクトなしで使用できませんでしたか? – lucasvw

答えて

2

C#はあまりJavaではありません。これはあなたが今後の対応に取り組まなければならないものです。

まず、チェックするExceptionを必要としない「安全」AutoCloseable実装を持ってする方法はありますか? closeメソッドからスローされない自分のクラスを含めるなら、なぜ私はそれをチェックしなければならないのかわかりません。

あなただけではなく、そのit's mandated by the interface.ために持っているが、それはは、いくつかのレベルで処理する必要がないチェック例外をスロー。

あなたのコードがでないことが分かっている場合は、は何らかの例外をスローすることはできますが、あなたはまだ何らかの保証付きで実行されていないブロック内に例外をスローすることができますcloseメソッドを実装しました。または、AutoCloseableを拡張してcloseを無効にする独自のインターフェイスを実装しないでください。例外をスローします。

+0

私はそのインターフェイスによって義務付けられていることを知っていますが、私のコードが安全であることを伝えたいと思います。 –

+0

あなたはインターフェイスによって命令を回避するつもりはありません。例外をスローしたり、発生することが不可能であることが分かっている場合にスローすることはできません。あなたのコードがどれほど安全であるかに関わらず、あなたはインターフェースを実装しているので、あなたは**厳密にその契約に従います。 – Makoto

+1

AutoCloseableを拡張し、チェックされた例外がスローされずにclose()メソッドをオーバーライドするだけです。 –

0

誠の答えはあなたの質問の最初の部分に対処する素晴らしい仕事です。私は第2の問題に取り組もうとします。

私はあなたがしたいと思うものは、リソースなしで試してみてください。例えば:

try { 
    //yay! 
} finally { 
    // always executed 
} 

finallyブロックにかかわらず、例外がスローされたか否かに実行されます。

編集:

はい:あなたが実行するために何が必要でない場合 、あなただけ

{ 
    //yay! 
} 
+0

確かに私はそれについて知っているが、それだけで '試し 'よりも多くの儀式がある。 –

+0

私の答えを更新しました。これはちょうどあなたが達成しようとしていることについて私はまだ少しばかりだと認めていますが、あなたがJavaで一緒に暮らさなければならないものかもしれません – lucasvw

1

あなたの最初の質問を新しいブロックを宣言することができます。実装でチェック例外をスローしない場合、スロー例外部分なしでAutoCloseable.closeを実装できます。

あなたの2番目の質問:

いいえ、リソース文で試すには、その変数が必要です。あなたは、無視されたものや使われていないものに名前を変更して、それを明確にすることができます。

final class Test implements AutoCloseable { 
    @Override 
    public void close() { 
     System.out.println("Closing"); 
    } 

    public static void main(String[] args) { 
     try (Test ignored = new Test()) { 
      System.out.println("Not using ignored"); 
     } 
    } 
} 
関連する問題