Effective Java Item 12 - 始終覆寫 toString() 方法
整理Effective Java書中Item 12: Always override toString心得筆記
主旨
Object 提供了一個 toString() 方法的預設實作,但它返回的字串通常不是使用者希望看到的。預設返回的字串由類名及其哈希碼的十六進制表示組成,例如:PhoneNumber@163b91。這樣的格式雖然簡潔,但與 707-867-5309 比起來,並不具備足夠的資訊。
toString() 方法的通用契約指出,返回的字串應該是「簡潔且具資訊量的,且容易閱讀的格式」,但 PhoneNumber@163b91 這樣的字串雖簡潔,卻缺乏實際意義。契約還強調:「建議所有子類別都應該覆寫此方法」,這確實是個好建議!
劃重點
為什麼覆寫 toString() 方法很重要?
- 調試與可讀性:
toString()方法在調試時非常有用,當物件被傳遞給println()、printf()、字串連接運算符或assert,或是由除錯器印出時,toString()會自動被呼叫。如果沒有覆寫toString(),生成的診斷訊息可能完全沒有幫助。
- 提高
HashMap等集合的可用性:如果你將物件當作HashMap的鍵,覆寫toString()可以讓你在印出Map時看到更有意義的訊息,而不是像PhoneNumber@163b91這樣毫無意義的字串。
實際範例:覆寫 toString() 方法
假設你有一個 PhoneNumber 類別,應該為它提供一個有用的字串表示形式:
實際範例:覆寫 toString() 方法
這樣覆寫 toString() 方法,能夠將 PhoneNumber 物件以 707-867-5309 這樣的格式輸出,比 PhoneNumber@163b91 更具實用性。
實際應用場景
如果你沒有覆寫 toString(),生成的診斷訊息將可能完全沒有意義,特別是在日誌或錯誤訊息中。例如,當你印出一個 Map 時,你更願意看到類似 {Jenny=707-867-5309} 的輸出,而不是 {Jenny=PhoneNumber@163b91}。
小結
- 覆寫
toString()方法可以大大提升類別的可用性,尤其在調試和生成有用的錯誤訊息時。 - 當實作
toString()方法時,應該提供一個簡潔且實用的物件描述,並確保其格式容易被人類閱讀。 - 避免使用像
PhoneNumber@163b91這樣的預設表示,因為它不具備足夠的資訊。
Read other posts