建議49: 推薦覆寫toString方法
為什么要覆寫toString方法,這個問題很簡單,因為Java提供的默認toString方法不友好,打印出來看不懂,不覆寫不行,看這樣一段代碼:
1 public class Client { 2 public static void main(String[] args) { 3 System.out.println(new Person("張三")); 4 } 5 } 6 7 class Person { 8 private String name; 9 10 public Person(String _name) { 11 name = _name; 12 } 13 14 public String getName() { 15 return name; 16 } 17 18 public void setName(String name) { 19 this.name = name; 20 } 21 }
輸出的結果是:Person@1fc4bec。如果機器不同,@后面的內容也會不同,但格式都是相同的:類名 + @ + hashCode,這玩意就是給機器看的,人哪能看得懂呀!這就是因為我們沒有覆寫Object類的toString方法的緣故,修改一下,代碼如下所示:
public String toString(){ return String.format("%s.name=%s",this.getClass(),name); }
打印輸出:
class cn.summerchill.test.Person.name=張三
如此就可以在需要的時候輸出可調試信息了,而且也非常友好,特別是在Bean流行的項目中(一般的Web項目就是這樣),有了這樣的輸出才能更好的debug,否則查找錯誤就如海底撈針呀!當然,當Bean的屬性較多時,自己實現就不可取了,不過可以使用apache的commons工具包中的ToStringBuilder類,簡潔、實用又方便。
可能有讀者要說了,為什么通過println方法打印一個對象會調用toString方法?那是源於println的實現機制:如果是一個原始類型就直接打印,如果是一個類類型,則打印出其toString方法的返回值,如此而已!