检查异常是否违反开放封闭原则?

时间:2019-02-26 09:30:19

标签: java oop software-design open-closed-principle

我有两个已检查的异常:TestException1TestException2以及以下代码:

void p1() throws TestException1{
    p2();
}

void p2() throws TestException1 { 
    p3();
}

void p3() throws TestException1 {}

按以下方式编辑p3的签名是否违反了开闭原则?

void p3() throws TestException1, TestException2 {}

2 个答案:

答案 0 :(得分:0)

我想我现在明白你的意思了。 (第二次尝试)

严格来说,您对类源代码所做的任何更改都违反了开放封闭原则的“封闭”部分。违反的严重程度取决于更改的性质。

在您的示例中,更改Java中的公共API方法引发的检查后的异常是重大违反行为。如果不重新编译,则在使用方法...或Error子类异常的任何方法中均可能导致编译错误,这是由二进制兼容性问题引起的。确实,由于p3p2调用,而p1间接调用,因此您实际上需要更改该类的更多内容才能进行编译。这可能会使API的更改范围变大。

所以对你的问题:

  

检查异常是否违反开放封闭原则?

不完全是。

可以使用已检查的异常,而不会违反开放封闭原则。但是,将已检查的异常添加到已“冻结”的API方法确实违反了该原理。但是,是添加异常的行为才是违规……不是异常本身,也不是一般检查的异常。

答案 1 :(得分:0)

不,由于OCP适用于模块而不是方法,很简单,因此检查异常不会违反OCP

如果您认为检查异常只是方法签名的另一部分,则此问题与方法名称或方法参数或方法返回类型是否违反OCP相同。该原理根本不适用于此粒度级别。

如果不知道该方法的实现方式,或者更重要的是,该方法如何通过其模块的API公开,我们将无从判断。例如,一种方法可能依赖于硬编码的常量。但是如果该方法可以被客户端覆盖,则它仍然可以扩展。没有检查异常的存在,并不能告诉我们模块是否可扩展。

另一方面,如果检查的异常导致方法成为最终方法,并且如果该方法作为某个模块作为其公共API的一部分被模块公开,并且该模块没有提供该API的替代方案,则它将是违反OCP。

相关问题