【问题标题】:How to organize Exception classes without code duplication?如何在不重复代码的情况下组织异常类?
【发布时间】:2010-10-26 19:10:13
【问题描述】:

我的包中有许多自定义的Exception-inheriting 类,它们与它们的基类没有区别。我拥有它们的唯一目的是在抛出异常原因时将其与另一种异常原因区分开来。这就是我的 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 不允许这样做。有什么解决办法吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    您可以创建一个通用类,其代码属性可通过控制器设置。这样你在抛出时只能有一个类和一个实例。

    也就是说,我不同意你说班级是双胞胎。它们代表完全不同的功能异常。基于关注点分离模式,当前的实现是正确的。使用我的通用类会在你的类中混合关注点,这应该被禁止。

    此外,我看到您从 Exception 继承...我不会解释太多,但您应该使用 RuntimeException 来处理应用程序中的功能异常。在网上四处看看,有很多关于它的文献。

    【讨论】:

    • 我不同意不检查功能异常(继承自RuntimeException)。类实际上是“语义双胞胎”,因为它们之间的唯一区别是它们的名称。其余代码完全相同,意思是“代码重复”,这是编程中所有错误的主要原因:(
    • Vincenzo,关于 RuntimeException 的讨论太长,无法在此线程中进行。但我知道我是对的:)。面向对象旨在为不同的关注点创建不同的对象。一个类的名称还应该解释它的关注点。如果您有两个名称不同的课程,我会邀请您,这是因为它们对不同的关注点做出了回应。如果两个具有不同名称的异常的含义相同,那么您至少必须将它们重命名为具有相似的名称。如果它们在同一个包中,您可以删除一个异常类的出现。希望我很清楚。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 2012-04-03
      相关资源
      最近更新 更多