我有两个选项(技术上来说是一样的,据我所知)来声明一个自定义异常类,仅从特定类com.XXX.Foo
抛出:
- 作为包中的公共类:
com.XXX.CustomException
- 作为静态内部类:
com.XXX.Foo.CustomException
哪个选项更好?
我有两个选项(技术上来说是一样的,据我所知)来声明一个自定义异常类,仅从特定类com.XXX.Foo
抛出:
com.XXX.CustomException
com.XXX.Foo.CustomException
哪个选项更好?
如果异常与Foo
类密切相关,我不介意将其保留为public
嵌套类。如果需要提取它,只需提取即可。
但是,在一般实践中,我从未见过为异常定义嵌套类的情况。我也不知道Java API中是否存在这样的类。
在我的10年以上的Java经验中,我无法回忆起遇到过将公共异常类定义为静态内部类的API。我不能给你一个具体的原因,说明为什么这样做是不好的,但这肯定会使你的代码变得不寻常。
既然明显没有人这样做,为什么你觉得有必要这样做呢?我希望你不是只为了“创新”而这样做。
(顺便说一句,我知道一些知名的Java API使用public static内部类和接口来实现其他功能。我特别讲的是异常类的情况。)
Foo
输入错误的异常。如果我将其命名为Foo.InvalidInput
,那么名称很短,与Foo
的关联是不可避免的。如果我将其放在Foo
类外,并将其命名为FooInvalidCriteria
,则我不能从类Bar
中重用它,除非更改其名称(相当于更改其位置)。Foo
之外,并保持其名称通用,例如InvalidInput
。然后,当我稍后意识到Bar
也可能存在无效输入并开始抛出此异常时。所有编译和运行都很好,只有现在处理InvalidInput
并假设它们正在处理来自Foo
的错误的所有位置仍然可以处理来自Bar
的错误,如果Foo
以一种可能导致抛出此异常的方式在内部使用Bar
。这可能会轻松引起代码破坏。至于第二个点……“其他人都不这样做”从来没有什么意义。要么这确实是错误的事情,因此会有其他理由不这样做,所以“其他人都不这样做”的论据是不必要的。要么就不是。而且,即使这个例子在理论上是一个好主意,它也并不是非常复杂和难以理解,所以甚至连“这是出乎意料的,所以人们即使是一个好主意也会有跟随的困难”的论据也不是非常强有力。
我更喜欢在同一包中使用(不一定是公共的)类,因为包是描述业务模型的逻辑类组,异常作为技术部分属于其中。
当用户查看包时,将立即看到异常,而不需要阅读类foo的文件,这有助于维护和提高代码清晰度、可读性和理解性。定义自定义异常并告知API用户非常好!
只有在明确是该类的私有内容时才会使用内部类。
尽管如此,我们在这里讨论的主要是一个约定俗成的问题!
javax.swing.RowFilter.Entry
的类? - Adeel Ansaristatic
在类上的作用方式完全不同。请参考这个线程以获得澄清,https://dev59.com/GXVD5IYBdhLWcg3wJIIK。 - Adeel Ansari将异常作为内部类通常不是一个好主意,因为它们的本质是可能在各个级别上引发的,即使在简单的架构中也是如此。所抛出的异常类必须从其包含类中引用,如果该类未知于类路径,则可能会发生诸如ClassCastException等不良情况。