2

如何拥有MyExceptionMyRuntimeException使用相同的自定义getMessage()实现?

由于 Java 没有多重继承,我不知道该怎么做。目前我在两个类中都有重复的代码......

重要细节:getMessage()做this.class.getName()之类的东西。所以我确实需要getMessage()使用反射,因为我需要对象的类名进行本地化。

所以要么我需要一个解决我的第一个问题的解决方案,要么需要一个关于如何在静态方法中使用反射的解决方案,然后我可以使用一些两个异常都可以使用的实用程序类?

一种解决方案可能是某个辅助类中的静态方法,然后使用它:

return new Object() { }.getClass().getEnclosureClass().getEnclosureClass();

不是吗?

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
    }
}

编辑- 如果您的 Exception 子类不仅仅是getMessage在它们之间复制粘贴的 impl,您可能也希望共享它。对上述内容稍作调整以将静态帮助程序转换为封装类将很好地处理此问题。

例如:创建一个名为 的类ExceptionDetails,该共享代码和变量(以及任何其他重复项)可以存在于其中,并且每个 Exception 子类都有自己的ExceptionDetails.

于 2013-01-04T21:08:45.833 回答
2

您必须将 getMessage() 的实际实现放入一个新的具体类中,并委托给该类的实例 inMyExceptionMyRuntimeException

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 的实例,或者以其他方式。正如您所指出的,您被单继承所困,因此如果您想在两个类之间重用实现,就无法避免委托。

正如 Chris 所指出的,在他的回答中,静态辅助方法也很有意义。至少在您的消息策略足够复杂以保证您可以编写一些实例之前。

编辑:

要访问异常类的名称,请将某些内容传递给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 回答