匿名の内部クラスからのチェック例外のスロー

匿名の内部クラスを使用してコードを実行するときに、JavaでException Transparencyを取得するベストプラクティス方法は何ですか。

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

try {
    boolean success = AccessController.doPrivileged(
        new PrivilegedExceptionAction() {
            @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
    }
}

コードを読み取っても、内部コードはFile not foundしかスローされませんが、呼び出し側は実際に例外がスローされたことに気づかずにチェック例外の利点を失います。一般的なバグは、新しい例外をスローする匿名の内部クラスにコードを導入することであり、コードはその例外を処理するよう強制しません。

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

public interface PrivilegedExceptionAction
{
    public T run() throws V;
}
6
追加された 編集された
ビュー: 1
私は匿名の内部クラスは、一般的に、再利用や拡張ができないために、悪い考えであると思います。しかしこれもまた別の理由です。私はどんな答えにも興味があります。
追加された 著者 user949300,
追加された 著者 alexsmail,
sun.comのリンクが死んでいる。ここに記載されている記事は blogs.oracle.com/briangoetz/entry/&hellip です。
追加された 著者 GeneSys,
私はプロジェクトのラムダの下でブライアンの提案を見ましたが、残念ながらこれはjava 6で利用できません
追加された 著者 bluphoenix,

1 答え

私はなぜそうは思わない。次のコードが機能しました。

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 ( ) ;
    }
}
3
追加された
複数の例外をスローする必要がある場合は、2つのオプションがあります。 (1)あなたがE1がExceptionを拡張すると言うように、E2はExceptionを拡張します。 (2)投げられる可能性があるすべての例外のスーパークラスになるようにEを選択することができます。 1を選択すると、インタフェースはRunIt のように見えて、多くの種類のチェック例外を許可します。 (必要以上のものがある場合は、余裕をRuntimeExceptionに設定することができます)。2を選択すると、その種の練習の目的を破ることができます。それは素晴らしい解決策ではありませんが、機能します。
追加された 著者 emory,
複数の例外をスローする必要がある場合、あなたは何をしますか? RunIt2 がありますか?私はそれがすべて悪くないと思う。私は、どのインターフェースを使用するかを選択しなければならないでしょう。
追加された 著者 bluphoenix,