2010-01-02 40 views
2

爲了在基於Servlet的應用程序中使用,我編寫了一個類來存儲視圖名稱和要呈現的對象。實際上,它是一種數據結構,而不是OOP意義上的類。我想知道我是否應該公開這些成員,或者是否應該使用獲得者。將數據結構中的成員公開爲類?

public class Result { 

    private final int status; 
    private final String view; 
    private final Map<String, Object> model = new HashMap<String, Object>(); 

    public Result(final int status, final String view) { 
     this.status = status; 
     this.view = view; 
    } 

    public Result put(final String modelName, final Object modelObject) { 
     model.put(modelName, modelObject); 
     return this; 
    } 

} 

如果我的getStatus添加(),getView()和getModel()或者我應該更改成員的可視性,以 「公」?目前,我不知道有什麼方法可以讓方法訪問成員。 「結果」是一個不可變的數據結構,當訪問成員時不需要計算。您是否會爲實施更改的不太可能發生的事件添加getter?

附錄

我讀到有關我的羅伯特·馬丁斯優秀圖書的問題Clean Code(第99頁)一節:

雜交

這種混亂[關於對象和數據結構]有時會導致 不幸的混合結構,即 半對象和半數據st ructure。 他們有做 顯著的事情功能,並且他們也有 無論是公共變量或公共 存取函數,對於所有 意圖和目的,使私人 可變公衆,誘惑等 外部函數使用這些 變量程序性程序 將使用數據結構的方式。

這樣的混合使得很難添加新的功能,但也使得難以添加新的數據結構。他們是兩個世界中最糟糕的。避免創建 他們。它們表明模糊的 設計,其作者不確定 - 或更糟,無知 - 他們是否需要保護功能或 類型。

+0

Duplicate:http://stackoverflow.com/questions/1949351/benefits-of-getter-setter-vs-public-vars – 2010-01-02 13:16:06

回答

1

我無法提出具體建議,因爲它取決於您將如何使用該類。但是...

我經常創建「輕量級」對象,用作數據結構來傳輸一些不可變數據。像你一樣,我讓成員public final並在構造函數中初始化它們。

與可訪問的可變數據成員相關的風險在最終決定時不存在;所有你失去的是有意義地將這個班子劃分的能力。另外,您不能將功能附加到數據訪問。但是對於一個輕量級的數據傳輸對象,無​​論如何你都不會這麼做。

2

對於創建獲取者的數據持有者類是否有趣。根據您的描述,您可以將狀態和視圖設置爲公開狀態或打包狀態,但是我會添加一個獲取器以按名稱檢索模型。雖然地圖是最終的,但它的內容不是。

編輯 我的意思是這樣的:

public Object get(final String modelName) { 
    return model.get(modelName); 
} 

沒有理由使模型圖中可見。 (我會將地圖命名爲「模型」,並使用setModel(name, model)getModel(name)作爲訪問器。)

+0

你的意思是這樣的嗎? public Map getModel(){ \t return java.util.Collections.unmodifiableMap(model); } – deamon 2010-01-02 12:50:06

+1

+1,我還會指出一個缺點:如果您稍後改變主意並決定創建獲取者/設置者,則必須更改所有客戶端。 Java沒有內置屬性的概念。 – 2010-01-02 13:16:26

+0

揭露地圖的原因是像FreeMarker這樣的模板引擎可以直接處理地圖。 – deamon 2010-01-02 13:59:28

1

你說:

此刻,我不知道任何 場景,其中以 具有訪問成員的方法將是有益的。

這正是我主張通過獲取者訪問數據的原因。此時您正在使用該對象在模型中存儲相應的對象。但是,您的模型在未來可能會發生變化,但您可能希望以相同的方式在視圖中顯示數據。

鑑於此,並且在測試MVC的視圖組件時感到頭疼,我總是會實現getter/setter機制。