2011-11-12 21 views
6

匿名内部クラスを使用してコードを実行するときに、例外の透明度をJavaで取得するベストプラクティス方法は何ですか。匿名内部クラスからのチェック例外のスロー

私が実際のコードで見た頻繁なパターンは、いくつかのコードに対していくつかのコンテキストを指定するために、いくつかの擬似Runnable型インターフェイスを使用しています。 JDKで考えることができる最良の例は、java.security.PrivilegedExceptionActionです。

try { 
    boolean success = AccessController.doPrivileged(
     new PrivilegedExceptionAction<Boolean>() { 
      @Override 
      public Boolean run() throws Exception { 
       // do something 
       // read file 
       FileInputStream fileInputStream = 
        new FileInputStream(new File("someFile")); 
       return true; 
      } 
     } 
    ); 
} catch (PrivilegedActionException e) { 
    if (e.getCause() instanceof FileNotFoundException) { 
     // handle IO exception 
    } else { 
     // impossible no other checked exception 
    } 
} 

にもかかわらずコードあなたは明確に、内のコードだけで見つからないファイルを投げる見ることができますが、呼び出し側は、例外が実際にスローされているものを認識していないとして、我々はチェック例外の利益を失ったを読んで。一般的なバグは、新しい例外をスローする匿名の内部クラスにコードを導入することであり、コードはその例外を処理するよう強制しません。

私が欲しいのは、以下のようなものです。このタイプの動作は言語の変更なしに達成可能ですか?

public interface PrivilegedExceptionAction<T,V... extends Throwable> 
{ 
    public T run() throws V; 
} 
+0

匿名の内部クラスは、主に再利用や拡張ができないため、一般的には悪い考えです。しかしこれもまた別の理由です。私はどんな答えにも興味があります。 – user949300

+0

http://blogs.sun.com/briangoetz/entry/exception_transparency_in_javaを見てください – alexsmail

+0

私はプロジェクトlambdaの下でブライアンの提案を見ましたが、残念ながらこれはjava 6で利用できません – bluphoenix

答えて

3

私はなぜそうは見ませんか?次のコードが機能しました。

interface RunIt < E extends Exception > 
{ 
    void run () throws E ; 
} 

class App 
{ 
    public static void main (String [ ] args) 
    { 
     RunIt <RuntimeException> r = new RunIt <RuntimeException> () 
     { 
      public void run () 
      { 
       throw new RuntimeException () ; 
      } 
     } ; 
     r . run () ; 
    } 
} 
+0

複数の例外をスローする必要がある場合はどうしますか? RunIt2 がありますか?私はそれがすべて悪くないと思う。私は、どのインターフェースを使用するかを選択しなければならないでしょう。 – bluphoenix

+0

複数の例外をスローする必要がある場合は、2つのオプションがあります。 (1)あなたがE1がExceptionを拡張すると言うように、E2はExceptionを拡張します。 (2)投げられる可能性があるすべての例外のスーパークラスになるようにEを選択することができます。 1を選択すると、RunIt のように表示され、多くの種類のチェック例外が許可されます。 (必要以上のものがある場合は、余裕をRuntimeExceptionに設定することができます)。2を選択すると、その種の練習の目的を破ることができます。それは素晴らしい解決策ではありませんが、機能します。 – emory

関連する問題