2

同じカスタム実装MyExceptionを使用するにはどうすればよいですか?MyRuntimeExceptiongetMessage()

Javaには多重継承がないので、どうしたらよいかわかりません。現時点では、両方のクラスに重複するコードがあります...

重要な詳細:getMessage()this.class.getName()のようなものを行います。したがってgetMessage()、ローカリゼーションにはオブジェクトのクラス名が必要になるため、リフレクションを使用する必要があります。

したがって、最初の質問の解決策、または静的メソッドの原因内でリフレクションを使用する方法の解決策が必要な場合は、両方の例外で使用できるユーティリティクラスを使用できますか?

1つの解決策は、ヘルパークラスの静的メソッドであり、これを使用する場合があります。

新しいObject(){} .getClass()。getEnclosingClass()。getEnclosingClass();を返します。

ではない?

4

2 に答える 2

7

静的共有ヘルパー関数を作成して、カスタムgetMessageを実装してみてください。

class MyException extends Exception {
    ....
    public String getMessage() {
        return ExceptionHelper.getMessage(this);
    }
}

class MyRuntimeException extends RuntimeException {
    ....
    public String getMessage() {
        return ExceptionHelper.getMessage(this);
    }
}

class ExceptionHelper {
    public static String getMessage(Exception e) {
        // your shared impl here
    }
}

編集-例外サブクラスにコピー貼り付けの単純なもの以上のものがあるgetMessage場合は、それも共有することをお勧めします。静的ヘルパーをカプセル化されたクラスに変えるために上記を少し調整すると、これをうまく処理できます。

例:のような名前のクラスを作成しますExceptionDetails。この共有コードと変数(およびその他の複製)が存在する可能性があり、各Exceptionサブクラスには独自のインスタンスがありExceptionDetailsます。

于 2013-01-04T21:08:45.833 に答える
2

getMessage()の実際の実装を新しい具象クラスに入れ、とでそのクラスのインスタンスにデリゲートする必要がありMyExceptionますMyRuntimeException

class MyExceptionMessage {
  public String getMessage() { ... }
}

class MyException extends Exception {
  private MyExceptionMessage messager;

  public String getMessage() { return messager.getMessage; }
}

class MyRuntimeException extends RuntimeException {
  private MyExceptionMessage messager;

  public String getMessage() { return messager.getMessage; }
}

MyExceptionMessageのインスタンスは、各例外クラスのコンストラクター、またはその他の方法で作成できます。お気づきのように、単一の継承で立ち往生しているため、2つのクラス間で実装を再利用する場合は、委任を回避する方法はありません。

クリスが指摘したように、彼の答えでは、静的ヘルパーメソッドも理にかなっています。少なくとも、メッセージ戦略が複雑になり、作成できるインスタンスがいくつかあることを保証するまでは。

編集:

例外クラスの名前にアクセスするには、コンストラクターに何かをMyExceptionMessage渡します。例外オブジェクト、そのクラス、またはクラスの名前を渡すことができます。例外が実装するインターフェースを定義することもできます。これには、メッセージ送信者に知っておく必要のあることをすべて伝えるメソッドが含まれています。

interface Messagable {
  public String getMessageFragment();
}

class MyExceptionMessage {
  public String getMessage(Messageable) { 
    return "something" + messagable.getMessageFragment() + "something else";
  }
}

class MyException extends Exception implements Messagable {
  private MyExceptionMessage messager;
  public String getMessage() { 
    return messager.getMessage(this);
  }
}

// class MyRuntimeException would have a similar getMessage() implementation
于 2013-01-04T21:13:37.837 に答える