Ove*_*404 5 java oop software-design open-closed-principle
我有两个已检查的异常:TestException1和TestException2以及以下代码:
void p1() throws TestException1{
p2();
}
void p2() throws TestException1 {
p3();
}
void p3() throws TestException1 {}
Run Code Online (Sandbox Code Playgroud)
对p3的签名进行如下编辑是否违反了开闭原则?
void p3() throws TestException1, TestException2 {}
Run Code Online (Sandbox Code Playgroud)
我想我现在明白你的问题的意思了。(第二次尝试)
严格来说,对类的源代码所做的任何更改都违反了开放封闭原则的“封闭”部分。违规的严重程度取决于变更的性质。
在您的示例中,更改 Java 中的公共 API 方法引发的已检查异常是严重违规。如果不重新编译,很容易导致任何使用该方法的方法出现编译错误...或者Error由于二进制兼容性问题而导致子类异常。事实上,由于p3是由p2和 间接调用的p1,所以您实际上需要更改该类的更多内容才能使其编译。这可能会使 API 变更的范围更大。
所以对于你的问题:
检查异常是否违反了开闭原则?
不完全是。
可以在不违反开闭原则的情况下使用受检异常。然而,向已经“冻结”的 API 方法添加检查异常确实违反了原则1。但添加异常的行为才是违规……而不是异常本身,或者一般的检查异常。
1 - 甚至这一点也是有争议的。反之,修复设计缺陷和错误并不违反开放封闭原则。