我有两个已检查的异常:TestException1
和TestException2
以及以下代码:
void p1() throws TestException1{
p2();
}
void p2() throws TestException1 {
p3();
}
void p3() throws TestException1 {}
按以下方式编辑p3的签名是否违反了开闭原则?
void p3() throws TestException1, TestException2 {}
答案 0 :(得分:0)
我想我现在明白你的意思了。 (第二次尝试)
严格来说,您对类源代码所做的任何更改都违反了开放封闭原则的“封闭”部分。违反的严重程度取决于更改的性质。
在您的示例中,更改Java中的公共API方法引发的检查后的异常是重大违反行为。如果不重新编译,则在使用方法...或Error
子类异常的任何方法中均可能导致编译错误,这是由二进制兼容性问题引起的。确实,由于p3
由p2
调用,而p1
间接调用,因此您实际上需要更改该类的更多内容才能进行编译。这可能会使API的更改范围变大。
所以对你的问题:
检查异常是否违反开放封闭原则?
不完全是。
可以使用已检查的异常,而不会违反开放封闭原则。但是,将已检查的异常添加到已“冻结”的API方法确实违反了该原理。但是,是添加异常的行为才是违规……不是异常本身,也不是一般检查的异常。
答案 1 :(得分:0)
不,由于OCP适用于模块而不是方法,很简单,因此检查异常不会违反OCP。
如果您认为检查异常只是方法签名的另一部分,则此问题与方法名称或方法参数或方法返回类型是否违反OCP相同。该原理根本不适用于此粒度级别。
如果不知道该方法的实现方式,或者更重要的是,该方法如何通过其模块的API公开,我们将无从判断。例如,一种方法可能依赖于硬编码的常量。但是如果该方法可以被客户端覆盖,则它仍然可以扩展。没有检查异常的存在,并不能告诉我们模块是否可扩展。
另一方面,如果检查的异常导致方法成为最终方法,并且如果该方法作为某个模块作为其公共API的一部分被模块公开,并且该模块没有提供该API的替代方案,则它将是违反OCP。