首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开放/封闭原则和违反封装

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

Stack Overflow用户
提问于 2016-09-22 01:48:19
回答 1查看 304关注 0票数 0

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

代码语言:javascript
复制
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允许具体的继承者更改已定义的状态。从我的角度来看,它违反了封装。更重要的是,我认为它也违反了开放/封闭原则。坦率地说,我的一些同事持相反的观点。我真的没有太多的经验,所以我很难认识到它。请在这里分享你的观点。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-09-22 01:57:59

这与Open - Closed原则没有直接关系,Open - Closed原则只是意味着要向您的系统添加新的行为,您应该创建一个新的实现类,而不是更改旧的类。为此,使用抽象类是很好的。

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

代码语言:javascript
复制
protected final void setSysProp(ClassThatSetEnvironmentProperty sysProp) {
    this.sysProp = sysProp;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39623322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档