我正在閱讀關於私有類數據設計模式我試圖理解它能夠實現什麼。Java中的私有類數據設計模式
從我所瞭解的私人類數據設計模式來看,即使對於類本身,它也是一種旨在重現「只讀」屬性的結構模式:雖然「私有」屬性僅對類本身可見且可編輯,但「私有班級數據「根本無法改變(即使偶然)。唯一的解決辦法是在私有類數據中提供一個setter,雖然(至少在我看來)如果私有類數據擁有屬性的所有設置者,那麼我們可能已經打敗了這個模式的目的。
假設我的理解是正確的,這會產生一個問題:即使主類不能更改任何私有類數據屬性,它也可以設置私有類數據本身的引用,並使用它的變量填充它想要改變。
換句話說,一個冷漠的開發人員可能會做這樣的事情:(通過readonly
保留字不像C#)
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 :(
}
}
自「只讀」屬性不是編譯執行,Java中的懶惰的開發可能做這樣的事情。如果這是真的,那我們爲什麼要使用這種設計模式呢?與其他模式(如單例模式)不同,這種模式不會強制執行任何操作,爲什麼我們要使用它?
- 如果您可以提供使用此模式的示例並且具體幫助您解決某些軟件問題,那將是非常好的;
- 讓我們繼續談論Java:我知道在C#中一切都變得容易多了,但是由於
readonly
保留字,模式很簡單,
謝謝你的回覆!
在你的例子中,當然,在具有私有字段的類中編寫代碼很容易,但重點是類的外部代碼無法更改它。 – Zircon
我認爲甲骨文不會滿意你的頭像http://startups.stackexchange.com/questions/209/is-it-ok-to-use-a-java-logo-in-my-business-card – HRgiger
@ HRgiger我想我需要改變那個頭像然後 – Koldar