【发布时间】:2017-03-02 17:31:54
【问题描述】:
我正在阅读关于 私有类数据设计模式 here 的内容,我正在尝试了解它真正能实现什么。
据我了解,私有类数据设计模式是一种结构模式,旨在为类本身重现“只读”属性:虽然“私有”属性仅对类本身可见和可编辑,但“私有类”中的属性数据”根本无法更改(即使是偶然的)。唯一的解决方案是在私有类数据中提供一个 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 :(
}
}
由于“readonly”属性不是编译强制的(与 C# 不同,通过 readonly 保留字),在 Java 中,懒惰的开发人员可能会做这样的事情。如果是真的,那我们为什么要使用这种设计模式呢?与其他模式(如单例模式)不同,此模式不强制执行任何操作,那么我们为什么要使用它呢?
- 如果您能提供使用此模式的示例并具体帮助您解决一些软件问题,那就太好了;
- 让我们继续使用 Java:我知道在 C# 中一切都容易得多,但是由于
readonly保留字,这种模式很简单;
感谢您的友好回复!
【问题讨论】:
-
在您的示例中,当然,在具有私有字段的类中编写代码很容易,但关键是类之外的任何代码都无法更改它。
-
我认为 Oracle 不会对你的头像感到满意 startups.stackexchange.com/questions/209/…
-
@HRgiger 我想我需要改变那个头像
-
@Zircon:为什么不直接使用 private 修饰符?你不能达到同样的结果吗?有什么区别?
-
不想让
private final MainData mainData解决这个替换问题?
标签: java design-patterns