Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打开/关闭原则和违反封装_Java_Open Closed Principle - Fatal编程技术网

Java 打开/关闭原则和违反封装

Java 打开/关闭原则和违反封装,java,open-closed-principle,Java,Open Closed Principle,你能检查一下下面的代码是否正确吗?事实上,我在Production代码中发现了类似的东西,我怀疑它是否符合开放/封闭原则 public abstract class CustomClass { private ClassThatSetEnvironmentProperty sysProp = new ClassThatSetEnvironmentProperty("SYS_PROPETY", "SYS_PROPERTY_VALUE"); // some code here

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

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仅为单元测试的可能性定义(mock
ClassThatSetEnvironmentProperty
)。但在这种情况下,setter允许具体的继承者更改定义的状态。在我看来,它违反了封装。此外,我认为这也违反了开放/封闭原则。坦率地说,我的一些同事持相反的观点。我真的没有太多的经验,所以我很难认识到这一点。请在这里分享你的观点。谢谢。

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

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

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

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

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

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

我更喜欢构造函数注入而不是setter注入。你是对的,我完全同意你的观点。但是当前的情况又如何呢?开放/封闭原则的定义指出,应该能够在不修改其源代码的情况下更改类的行为。在这种情况下,我认为这根本没有违反原则。源代码保持不变,但更改了sysProp;我会使用构造函数。您可以使其不可变,而不破坏封装。@christopher好的,谢谢。但我的理解是,
classsetEnvironmentProperty
实例化是在抽象类中定义的,用于为继承者定义公共状态的一部分。如果属性可以更改,那么在每个具体类中定义它会更好吗?我更喜欢构造函数注入而不是setter注入。你是对的,我完全同意你的观点。但是当前的情况又如何呢?开放/封闭原则的定义指出,应该能够在不修改其源代码的情况下更改类的行为。在这种情况下,我认为这根本没有违反原则。源代码保持不变,但更改了sysProp;我会使用构造函数。您可以使其不可变,而不破坏封装。@christopher好的,谢谢。但我的理解是,
classsetEnvironmentProperty
实例化是在抽象类中定义的,用于为继承者定义公共状态的一部分。如果属性可以更改,那么在每个具体类中定义它会更好吗?我同意。Thank You Protected的限制性比package private(默认设置)小。它们有不同的限制。Protected确保所有扩展类都可以访问它。对于共享API,这是一个关键要求。@SilasReinagel,您或我都没有完全理解。我同意。Thank You Protected的限制性比package private(默认设置)小。它们有不同的限制。Protected确保所有扩展类都可以访问它。对于共享API,这是一个关键要求。@SilasReinagel,您或我都还没有完全理解。