您能检查一下以下代码是否正确吗?事实是,我在产品代码中发现了类似的东西,我怀疑它是否符合开放/封闭原则。
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允许具体的继承者更改已定义的状态。从我的角度来看,它违反了封装。更重要的是,我认为它也违反了开放/封闭原则。坦率地说,我的一些同事持相反的观点。我真的没有太多的经验,所以我很难认识到它。请在这里分享你的观点。谢谢。
发布于 2016-09-22 01:57:59
这与Open - Closed原则没有直接关系,Open - Closed原则只是意味着要向您的系统添加新的行为,您应该创建一个新的实现类,而不是更改旧的类。为此,使用抽象类是很好的。
唯一违反封装(这是一个不同的原则)的是包可访问的依赖项设置器。您可以通过将其更改为受保护的setter来修复该问题。然后,扩展类可以设置它们自己的状态,但外部调用者不能更改对象的状态。
protected final void setSysProp(ClassThatSetEnvironmentProperty sysProp) {
this.sysProp = sysProp;
}https://stackoverflow.com/questions/39623322
复制相似问题