首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Apache Commons Lang ToStringBuilder 使用指南:告別手寫 toString()

     編輯:Java 程式設計入門

為什麼需要 ToStringBuilder?

  • 手寫 toString() 繁瑣且易漏欄位
  • 新增欄位需同步修改 toString(),維護成本高
  • 格式不統一,除錯時難以閱讀
  • ToStringBuilder 自動反射欄位,支援多種輸出風格,一行代碼搞定

Maven 依賴

<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] 純值列表,適合簡單記錄

進階技巧

1. 反射自動檢測所有欄位 (含私有)

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}

零配置,自動包含繼承鏈所有非 static、非 transient 欄位。

2. 自訂風格

ToStringStyle custom = new ToStringStyle() {
    {
        setArrayStart("[");
        setArrayEnd("]");
        setArraySeparator(", ");
        setFieldSeparator(" | ");
    }
};
return new ToStringBuilder(this, custom).append(...).toString();

3. 排除敏感欄位

return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
    .append("username", username)
    .append("password", "******") // 手動遮罩
    .append("email", email)
    .toString();

4. 效能考量

  • 反射版 (reflectionToString) 較慢,高頻呼叫場景建議手動 append
  • 生產環境日誌建議關閉詳細 toString 或使用懶評估 (如 Log4j2 StringBuilder 延遲)

替代方案對比

方案優點缺點推薦場景
ToStringBuilder功能豐富、風格多樣、成熟穩定需外部依賴、反射版效能較低企業級應用、複雜實體類
Lombok @ToString零代碼、編譯期生成、效能最佳需 IDE 外掛、調試時看不到生成代碼現代 Spring Boot 專案首選
IDE 自動生成無依賴、可見代碼、可微調手動維護、易過時簡單專案、無法引入第三方庫
Java 17+ Records內建標準 toString、不可變僅適用資料載體類DTO/VO/實體類優先考慮 Record
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved