Kol*_*dar 6 java design-patterns
我在阅读类的私有数据设计模式, 在这里,我试图了解它能够真正做到.
根据我的理解,私有类数据设计模式是一种结构模式,旨在重现"只读"属性,即使对于类本身:虽然"私有"属性是可见的,只能编辑为类本身,但"私有类数据"中的属性可以根本不会改变(即使偶然).唯一的解决方案是在私有类数据中提供一个setter,尽管(至少在我看来)如果私有类数据具有属性的所有setter,那么我们可能已经打败了模式的目的.
假设我的理解是正确的,这会导致一个问题:即使主类不能更改任何私有类数据属性,它也可以设置私有类数据本身的引用,用它想要更改的变量填充它.
换句话说,一个不关心的开发人员可能会这样做:
public class MainData {
int foo;
int bar;
public MainData(int foo, int bar) {
this.foo = foo;
this.bar = bar;
}
public int getFoo() {return foo;}
public int getBar() {return bar;}
}
public class Main {
private MainData mainData;
public Main(int foo, int bar) {
this.mainData = new MainData(foo, bar);
}
public doSomeWork() {
//correct behaviour
this.mainData.getFoo() + this.mainData.getBar();
//now I want to trick the pattern
this.mainData = new MainData(this.mainData.getFoo(), this.mainData.getBar()+4);
//I've changed bar :(
}
}
Run Code Online (Sandbox Code Playgroud)
由于"readonly"属性不是编译强制的(与C#通过readonly保留字不同),在Java中,懒惰的开发人员可能会做这样的事情.如果这是真的,那我们为什么要使用这种设计模式呢?与其他模式(如单身人士)不同,这种模式不会强制执行任何操作,那么我们为什么要使用它呢?
readonly保留字,模式很简单;谢谢你的回复!
撰写该文章的作者Private Class Data说,所谓的模式的意图是:
意图
- 控制对类属性的写访问
- 将数据与使用它的方法分开
- 封装类数据初始化
- 在构造函数之后提供新类型的final - final
让我们一个一个地看看意图
控制对类属性的写访问
我的意见是控制对类属性的写访问只需通过方法和修饰符完成.OOP称之为Encapsulation
将数据与使用它的方法分开
这对我来说没有多大意义,因为面向对象的编程意味着将数据和方法结合在一起.这是一个对象是什么.从使用它的方法中分离数据似乎是一种贫血的方法.
封装类数据初始化
这就是我在构造函数中所做的.我没有看到将此代码移动到另一个类的好处.
在构造函数之后提供新类型的final - final
此意图旨在使对数据类的引用最终,但不要使数据类中的属性最终.我猜这就是为什么它被称为"新型决赛".由于数据类仅保存数据并且方法与它们分离,因此如果数据类上没有setter,则无法修改数据.在这种情况下,数据是不可变的.因此,我没有看到数据类的好处只是使类的字段最终.
我的结论
我认为这种所谓的模式增加了复杂性而没有太大的好处.所以我不会用它.我称之为"所谓的模式",因为
我没有看到常见的问题.