toString() 是 Java 開發中最高頻呼叫的方法之一,但許多開發者僅知其表不知其理。本文從 JDK 原始碼出發,層層剖析 Object、String、CharSequence 的實現差異,並示範正確重寫姿勢。
public String toString() {
return getClass().getName() + '@' + Integer.toHexString(hashCode());
}
類全名@哈希碼(16進位),例如 com.example.User@1a2b3c4dpublic String toString() {
return this; // 已經是字串,直接回傳自身
}
Object 並實作 CharSequenceString@hash 這類無意義輸出String toString(); // 回傳包含此序列字元的字串,長度相同
StringString、StringBuilder、StringBuffer 皆實作此介面Object 的身分標識public class User {
private String name;
private int age;
// 未重寫 toString()
}
User u = new User(); u.setName("Tom"); u.setAge(20);
System.out.println(u); // 輸出:User@15db9742 ❌
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + '}';
}
// 輸出:User{name='Tom', age=20} ✅
// Java 7+ 標準庫
@Override
public String toString() {
return Objects.toStringHelper(this)
.add("name", name)
.add("age", age)
.toString();
}
// Apache Commons Lang 3
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
ClassName{field=value,...})toString() 應為純計算、無副作用****** 掩碼| 誤區 | 正確觀念 |
|---|---|
| 只在除錯用,不重要 | 日誌、監控、序列化、單元測試斷言皆依賴它 |
| 直接印陣列/集合 | 陣列未重寫 toString(),需用 Arrays.toString()/List.toString() |
| 重寫後格式隨意 | 統一格式利於日誌分析工具解析 |
toString() 是物件的「名片」,良好的實作能大幅提升除錯效率、日誌可讀性與系統可觀測性。養成「建立類即重寫 toString()」的習慣,是專業 Java 開發者的基本素養。