2011-01-21 19 views
5
class Address 
{ 
    private enum Component 
    { 
    NUMBER, 
    STREET, 
    STATE, 
    COUNTRY 
    } 

    private Map<Component, String> componentToValue = ...; 
} 

我想我的類包含兩個方法:toString():用於調試還是用於人類?

  1. 一來表示每個地址組成部分的值(這樣我就可以,如果出現任何錯誤調試)。
  2. 一個以人類預期的形式返回地址:「1600 Amphitheatre Parkway Mountain View,CA 94043」。

Object.toString()的最佳做法是什麼?它主要用於#1還是#2?這些方法的命名是否有最佳做法?

回答

13

去你格式化地址的短信和在HTML頁面中以同樣的方式?你會用英語,法語和日語以相同的方式格式化嗎?

如果否,那麼你有你的答案:演示文稿不屬於對象,而是顯示對象的表示層。除非該對象專門用於表示層,例如,如果它是HtmlI18nedAddress,請使用toString進行調試。

考慮Date vs SimpleDateFormatDate包含該狀態並且SimpleDateFormat返回多個表示。

-1

一兩件事你可以做的是使用一個調試標誌改變成你喜歡:

public String toString(boolean debug) { 
    if (debug) return debugStringVersion; 
    else return humanVersion; 
} 

public String toString() { 
    return toString(Util.DEBUG); 
} 

當然這是假設你有一個實用工具類,羊油了它調試標誌。

+3

這對我沒有意義嗎?如果生產性代碼中的toString()在debunging時改變它的返回值,應該如何使用它? – lweller 2011-01-21 18:37:10

+0

@lweller。你不能總是這樣做。但有時它可能會非常有幫助。 – jjnguy 2011-01-21 18:45:16

3

我會說第一個。數據格式不應該硬編碼到對象的ToString()函數中。我試着讓匹配的Parse(字符串數據)函數可讀的ToString()輸出數據(如果該函數實際存在或不重要)。因此,在這種情況下,如果您想要特定格式,請編寫特定函數,並將通用數據轉儲例程保留爲ToString()。

0

你可以從一些調試屬性讀取配置動態.:

@Override 
public String toString() { 

    if(debug) { 
     return debugAddrString() 
    } 
    return normalAddrString(); 

} 
+0

我看到我被擊敗了! – 2011-01-21 18:34:52

+1

這對我來說沒有意義嗎?如果生產性代碼中的toString()在debunging時改變它的返回值,應該如何使用它? – lweller 2011-01-21 18:36:36

+0

看起來像模擬C`define`。 – helpermethod 2011-01-21 18:40:00

-1

Javadoc說:

一般來說, 返回一個字符串 「文本方式 代表」 toString方法這個對象。結果 應該是一個簡明但內容豐富的 表示,對於 人來說,該表示很容易閱讀。

所以我用2

0

ToString通常只能用於調試信息。請記住,你正在覆蓋Object上的方法;對Object引用返回一個人類可讀地址的方法調用在概念上是否準確?在某些情況下,取決於項目,這可能確實有意義,但對我來說聽起來有點奇怪。我會實施一種新方法。

另一件需要注意的事情是,大多數現代IDE使用ToString方法在檢查對象時打印有關對象的調試信息。

相關問題