如何组织没有代码重复的异常类?

时间:2010-10-26 09:42:52

标签: java

我有一些自定义Exception - 在我的包中继承类,它们与它们的基类没有区别。我拥有它们的唯一目的是将一个异常原因与另一个异常原因区分开来。这是我的一个Exception类的样子:

package com.XXX;
/**
 * Thrown when query format is invalid.
 */
public class InvalidFormatException extends Exception {
  /**
   * Public ctor.
   * @param m Supplementary message
   */
  public InvalidFormatException(final String m) {
    super(m);
  }
}

问题是所有类都完全相同,就像双胞胎一样。唯一不同的是他们的名字。我不喜欢这种情况,因为这是一个明显的代码重复。在其他语言(如PHP,Python等)中,我会在运行时动态地声明这些类,但Java不允许这样,我也理解。有没有解决方法?

2 个答案:

答案 0 :(得分:5)

您可以使用控制器设置的代码属性创建泛型类。这样,抛出时只能有一个类和实例。

那就是说,当你说上课是双胞胎时,我不同意。它们代表完全不同的功能异常。基于关注点分离模式,当前的实现是正确的。使用我的泛型类会混淆你班级中的问题而且应该被禁止。

此外,我看到你继承了Exception ...我不会解释很多但是你应该在你的应用程序中使用RuntimeException来实现功能异常。在网上浏览,有很多关于它的文献。

答案 1 :(得分:0)

简单的答案是“不”,你不能轻易用Java声明飞行类。注意到,如果你真的想这样做,那就有可能you'll need to study how Java can compile classes at runtime。另一个简化是如果所有的异常类都相同,除了它们的名称,你可以定义它们扩展的自己的基类Exception类。

另一个想法是,你从拥有所有这些不同的异常类中获得了什么价值?您是否会根据Exception的抛出情况以不同的方式处理事务?如果没有,我建议检查你创建和简化的异常层次结构。

然后,如果你走得那么远,也可以考虑使用RuntimeException。这可能是圣战的理由,但是如果你真的不对抛出的东西做任何特别的事情,强迫你的客户处理它就没什么价值了。 See Bruce Eckel's article on the subject for some perspective