开放/封闭原则和违反封装

时间:2016-09-21 17:48:19

标签: java open-closed-principle

请您检查以下代码是否正确?事实是我在引用代码中发现了类似的东西,我怀疑它是否符合开放/封闭原则。

public abstract class CustomClass {

    private ClassThatSetEnvironmentProperty sysProp = new ClassThatSetEnvironmentProperty("SYS_PROPETY", "SYS_PROPERTY_VALUE");

    // some code here

    void setSysProp(ClassThatSetEnvironmentProperty sysProp) {
        this.sysProp = sysProp;
    }
}

我的理解是setter仅为单元测试可能性定义(模拟ClassThatSetEnvironmentProperty)。但在这种情况下,setter允许具体的继承者改变定义的状态。从我的角度来看,它违反了封装。更多我认为它也违反了开放/封闭的原则。坦率地说,我的一些同事采取了相反的观点。我真的没有多少经验,所以我很难认识到它。请在这里分享您的意见。谢谢。

1 个答案:

答案 0 :(得分:5)

这与开放封闭原则没有直接关系,开放封闭原则只是意味着要在系统中添加新行为,您应该创建一个新的实现类而不是更改旧的实现类。使用抽象类就可以了。

确实违反封装(这是一个不同的原则)的一件事是包可访问的依赖设置器。您可以通过将其更改为受保护的setter来解决该问题。然后扩展类可以自己设置,但外部调用者不能更改对象的状态。

protected final void setSysProp(ClassThatSetEnvironmentProperty sysProp) {
    this.sysProp = sysProp;
}