2017-03-01 27 views
2

我正在閱讀關於私有類數據設計模式​​我試圖理解它能夠實現什麼。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保留字,模式很簡單,

謝謝你的回覆!

+0

在你的例子中,當然,在具有私有字段的類中編寫代碼很容易,但重點是類的外部代碼無法更改它。 – Zircon

+2

我認爲甲骨文不會滿意你的頭像http://startups.stackexchange.com/questions/209/is-it-ok-to-use-a-java-logo-in-my-business-card – HRgiger

+0

@ HRgiger我想我需要改變那個頭像然後 – Koldar

回答

3

與寫入Private Class Data撰文人說,那所謂的模式的意圖是:

意向

  • 控制寫入級的訪問從方法屬性
  • 獨立數據使用它
  • 封裝類數據初始化
  • 提供新型決賽 - 構造後的最終

讓類屬性

我的看法是我們一起來看看意圖逐一

控制寫訪問控制對類屬性的寫入訪問只需通過方法和修飾符完成。 OOP調用於使用它的方法,這Encapsulation

另有數據

這並沒有太大的意義對我來說,因爲面向對象的編程手段,將數據和方法一起。那是一個什麼樣的對象。從使用它的方法中分離數據似乎是一種貧乏的方法。

包封物類數據初始化

這就是我在構造函數中做。我沒有看到將此代碼移到另一個類的好處。

提供新型決賽 - 最終構造

此意圖旨在使參照數據類決賽後,但不要在數據級決賽的屬性。我想這就是爲什麼它被稱爲「新類型的最終」。由於數據類只保存數據,並且方法與它們分離,所以如果數據類沒有設置者,則不能修改數據。在這種情況下,數據是不可變的。因此,我不認爲數據類的好處就是讓這個類的字段最終確定下來。

我的結論

我認爲,這個所謂的模式增加了複雜性沒有太多的好處。所以我不會使用它。我稱之爲「所謂的模式」,因爲

In software engineering, a software design pattern is a general reusable solution to a commonly occurring problem

我沒有看到通常存在的問題。

+0

我可以看到你的論點的根源(我發佈了這個問題,因爲我也有)。可能這種模式在Java中也是無用的(就像在C#中一樣)。也許在其他語言(也許是Python?)中,這可能是有道理的。虛無,我正在標記你的答案是正確的 – Koldar

0

私有(或內部)類的成員根本不是「只讀」的。 通過setter方法甚至直接改變它們的值是沒有問題的。

擁有「只讀」成員不是使用私有類的理由。這樣做的一個原因是該類只能在包含(或外部)類的範圍內訪問。

+0

對不起,你能更具體些嗎?根據[source making](https://sourcemaking.com/design_patterns/private_class_data)(討論或問題部分),私有數據類的目的似乎限制了屬性的變化,而不是可訪問性(UML圖似乎支持這是我的假設)。如果我想降低可訪問性,我不應該只使用內部類嗎?這樣,只有主類可以訪問成員。 – Koldar

+0

您所指的頁面上說:「...通過限制其可見性來減少屬性的暴露程度」。這並不意味着完全「只讀」,只是不易訪問。一旦(私人)成員在內部類中,它可以通過較小的範圍來看到。但是,仍然可以從內部類中看到和編輯。 –

+0

好的,我可以同意你關於內部類的特徵。但是我仍然無法理解你的回答與我的問題之間的關係。即使假設'MainData'是一個內部類,一個不知情的開發者可能會執行我在主要問題中利用的相同技巧(從而使內部類的使用變得毫無意義)(甚至更好,它可以直接設置私有成員)。那麼爲什麼我們應該使用這種特殊模式?可能我不明白你的觀點。 – Koldar