toString() 繁瑣且易漏欄位toString(),維護成本高<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version> <!-- 請用最新版 -->
</dependency>
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
public class Person {
private String name;
private int age;
private boolean smoker;
private String[] hobbies;
// 建構子、Getter/Setter 略...
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("name", name)
.append("age", age)
.append("smoker", smoker)
.append("hobbies", hobbies)
.toString();
}
}
假設物件:Person@182f0db[name=John Doe, age=33, smoker=false, hobbies=[read, swim]]
| 風格常數 | 輸出範例 | 適用場景 |
|---|---|---|
DEFAULT_STYLE |
Person@182f0db[name=John Doe,age=33,smoker=false,hobbies=[read, swim]] |
預設緊湊格式,適合日誌單行輸出 |
MULTI_LINE_STYLE |
Person@182f0db[ name=John Doe age=33 smoker=false hobbies=[read, swim] ] |
多行縮排,適合控制台除錯閱讀 |
NO_FIELD_NAMES_STYLE |
Person@182f0db[John Doe,33,false,[read, swim]] |
僅顯示值,適合 CSV/資料匯出 |
SHORT_PREFIX_STYLE |
Person[name=John Doe,age=33,smoker=false,hobbies=[read, swim]] |
短類名(無哈希碼),適合單元測試斷言 |
SIMPLE_STYLE |
John Doe,33,false,[read, swim] |
純值列表,適合簡單記錄 |
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
零配置,自動包含繼承鏈所有非 static、非 transient 欄位。
ToStringStyle custom = new ToStringStyle() {
{
setArrayStart("[");
setArrayEnd("]");
setArraySeparator(", ");
setFieldSeparator(" | ");
}
};
return new ToStringBuilder(this, custom).append(...).toString();
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("username", username)
.append("password", "******") // 手動遮罩
.append("email", email)
.toString();
reflectionToString) 較慢,高頻呼叫場景建議手動 appendtoString 或使用懶評估 (如 Log4j2 StringBuilder 延遲)| 方案 | 優點 | 缺點 | 推薦場景 |
|---|---|---|---|
| ToStringBuilder | 功能豐富、風格多樣、成熟穩定 | 需外部依賴、反射版效能較低 | 企業級應用、複雜實體類 |
Lombok @ToString | 零代碼、編譯期生成、效能最佳 | 需 IDE 外掛、調試時看不到生成代碼 | 現代 Spring Boot 專案首選 |
| IDE 自動生成 | 無依賴、可見代碼、可微調 | 手動維護、易過時 | 簡單專案、無法引入第三方庫 |
| Java 17+ Records | 內建標準 toString、不可變 | 僅適用資料載體類 | DTO/VO/實體類優先考慮 Record |