2012-12-13 60 views
5

我知道Javadocs says什麼時候應該重寫toString()?

返回該對象的字符串表示形式。通常,toString方法返回一個字符串,用於「文本地表示」此對象。結果應該是簡明但內容豐富的表示 ,這對人們來說很容易閱讀。建議所有 子類重寫此方法。

但是我什麼時候應該花時間覆蓋toString我的課程的方法?是否應該是我首先要做的第一件事之一是重寫equalshashCode?還是應該等到實際需要?

我知道Eclipse可以爲你自動生成toString方法,所以當我知道我的類的字段時,我應該讓Eclipse自動生成它們嗎?

+3

我很少做到這一點,如果我這樣做是爲了調試的目的 –

+0

由於現代IDE可以在瞬間爲你生成這個方法,爲什麼不使用它,如果你期望打印你的對象? –

+2

忽略自動生成可能性,取決於您。vanilla toString只是打印出對象類和哈希標識符。如果您想使用toString進行診斷打印,則值得努力添加自己的內容,以合理的方式打印對象的重要字段。 –

回答

12

喬希布洛赫給出Effective Java一個很好的解釋,在項目10

[...]提供了一個很好的toString實現使得你的類更愉快的使用。

這真的可以更容易地調試輸出的痕跡,或可以更好的日誌消息,因爲你可以使用toString()直接提供對象的字符串表示;您不必手動構建提供對象所需信息的字符串。

正如本書所述,您應該在所得的String中包含所有有趣的信息。你也應該正確記錄你的方法;您可以記錄或不記錄生成的String格式,但至少應記錄您的意圖(格式可能會更改,或不太可能更改)。

最後,決定是否在每個班級重寫它應該成爲你習慣的一部分,這取決於你(和你的公司的標準)。就個人而言,我不會在每個類中覆蓋toString(),只會在調試跟蹤中使用的風險最大。

+1

+1大多數IDE可以爲您生成toString()。當我想我可能會使用它時,我傾向於創建一個。 –

3

我會在任何持有human understandable non confidential data的類上執行toString()方法。例如:傳輸對象,Bean,數據對象,包裝器。對於這樣的類,繼續實現'toString()'方法。

表示服務的類,具有瞬態狀態的進程不需要實現該方法。在這裏,您可以等到實際需要時爲止。

請確保在'toString()'中不使用「transient」關鍵字暴露任何變量!

2

通常,當我要指定顯示對象的默認格式時,我會覆蓋它,通常會格式化緊湊/可消化的相關屬性顯示。所以,我可以簡單地說,例如,在調試顯示它或做記錄:

MyClass myClsInst = new MyClass(); 
... 
System.out.println(myClsInst); 
相關問題