2

まず第一に、オペレーターを嫌悪し、嫌悪し、軽蔑する人のためにinstanceof、私はあなたの懸念を理解していますが、それを使用することに行き詰まっています. これは、別の開発チームがプロジェクトをセットアップする方法を完全にリファクタリングする権限がないためです。そのため、ここで何かが欠けていない限り、それを回避する方法がわかりません。

変更できない Java POJO がありException、そのプロパティの 1 つとして設定できます。

public class Message {
    private Exception exception;

    public void setException(Exception exc) {
        this.exception = exc;
    }
}

繰り返しますが、このMessageクラスを変更することはできません。

インスタンスに渡されるエラー ハンドラー メソッドを作成しています。コンテナーに設定された例外の種類MessageContainerに応じて、さまざまなことを行うロジックが必要です。Message

public class ErrorHandler {
    public void handle(MessageContainer container) {
        Message msg = container.getMessage();
        Exception exc = msg.getException();

        if(exc instanceof FizzException)
            System.out.println("Do x");
        else if(exc instanceof BuzzException)
            System.out.println("Do y");
        else
            System.out.println("Do z");
    }
}

繰り返しますが、注入可能なインスタンスではなく、ErrorHandler#handle渡されたという事実を変更することはできません。MessageContainerMessage

したがって、私は本当に を使用するのは好きではありませinstanceofんが、このロジックを実現する他の方法は見当たりません (しかし、ぜひ提案をしてください... に変更を加えることを伴わない限りMessage) MessageContainer。またはhandle(MessageContainer)メソッド!)。

しかし、 を使用してもinstanceof、このコードはどのように機能するのでしょうか? Exceptionからを引き出すと、にキャストされ、 、 などであるかどうかを検出する方法がないため、 のMessageいずれも起動しないと思います。ここでのオプションは何ですか? 前もって感謝します。instanceofExceptionBuzzExceptionFizzException

4

3 に答える 3

3

このコードは期待どおりに機能します。実行時に、instanceofステートメントは の実際の型を比較し、excこれがException. 機能した唯一のステートメントが である場合、exc instanceof Exceptionまったくinstanceof価値がありません:)

別の解決策 (私は使用を避けます) は、完全修飾クラス名を比較することです。

String fqcn = exc.getClass().getName();

if (fqcn.equals("com.foo.FizzException") {
    // etc.
}
于 2013-01-25T18:47:09.980 に答える
1

例外へのキャスト

Exception exc = msg.getException();

例外ランタイム タイプは消去されません。基本型にキャストしただけです。はinstanceof引き続き機能します。ただし、FizzException が BuzzException を拡張する場合はinstanceof、別の順序でチェックを行う必要があります。つまり、最も派生した型を最初にチェックします。

それ以外の場合は、派生したものではなく、基本クラスのチェック句に入ります。

于 2013-01-25T18:49:11.637 に答える
1

あなたが何を望んでいるのかは明らかではありません。例外がすべて「与えられ」ており、それらの実装を変更できない場合は、 exception.getClass().getName() を使用してクラス名を取得し、おそらくテーブルなどで検索してコースを選択できますアクションの。

例外の実装の多くを変更できる場合は、「機能()」メソッドなどを提供するインターフェースをすべて実装してください。次に、特定の Exception オブジェクトがinstanceof MyFunctionalityInterfaceMyFunctionalityInterface にキャストされ、呼び出しfunctionality()てアクションをガイドするために必要な情報を返す場合。次に、instanceof または getClass().getName() を使用して、変更できない例外クラスを管理します。

于 2013-01-25T19:04:12.283 に答える