日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通过ToStringBuilder实现toString方法

發(fā)布時(shí)間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过ToStringBuilder实现toString方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.什么是ToStringBuilder?

ToStringBuilder 用于構(gòu)建一個(gè)類的toString字符串的工具類,使用該類需要導(dǎo)入commons-lang.jar;或者導(dǎo)入maven倉庫:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.8.1</version> </dependency>

然后導(dǎo)入即可:import org.apache.commons.lang3.builder.ToStringBuilder;

2.為什么要使用ToStringBuilder?

因?yàn)榇蟛糠謱?shí)體的toString()方法都用的是簡(jiǎn)單的"+",而每"+"一個(gè)就會(huì)new一個(gè)String對(duì)象,這樣如果系統(tǒng)內(nèi)存小的話會(huì)暴內(nèi)存。使用ToStringBuilder就可以避免暴內(nèi)存這種問題的。

3.主要方法有哪些?

append()方法: 該方法用于自定義添加需要打印哪些變量,只有使用append添加的變量才會(huì)在toString函數(shù)中打印。

// 方法源碼 public ToStringBuilder append(Object obj) {this.style.append(this.buffer, (String)null, obj, (Boolean)null);return this;}public ToStringBuilder append(String fieldName, Object obj) {this.style.append(this.buffer, fieldName, obj, (Boolean)null);return this;}...

reflectionToString()方法靜態(tài)): 該方法使用反射機(jī)制打印一個(gè)類中的所有變量,該函數(shù)還提供一個(gè)變量style,建議使用ToStringStyle.DEFAULT_STYLE。

//方法源碼 public static String reflectionToString(Object object) {return ReflectionToStringBuilder.toString(object);}public static String reflectionToString(Object object, ToStringStyle style) {return ReflectionToStringBuilder.toString(object, style); }...

4.具體使用

通過ToStringBuilder->實(shí)現(xiàn)toString方法:
1.ToStringBuilder比較適合在打日志時(shí),能夠很方便的自動(dòng)打印對(duì)象中的屬性值;
2.利用反射原理拿到對(duì)象中域fields的屬性并添加到新的對(duì)象中builder并最終toString;
(注:idea安裝了lombok插件,只要在類前增加@Getter和@Setter注解即可不用手寫方法!)

import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.builder.ToStringBuilder; import java.io.Serializable; import java.lang.reflect.Field; import java.sql.Timestamp;/*** DTO: 基礎(chǔ)數(shù)據(jù)傳輸對(duì)象(Data Transfer Object)*/ @Getter @Setter public class BaseDTO implements Serializable {private String createBy;private String updatedBy;private Timestamp createTime;private Timestamp updateTime;@Overridepublic String toString() {ToStringBuilder builder = new ToStringBuilder(this);Field[] fields = this.getClass().getDeclaredFields();try {for (Field f : fields) {f.setAccessible(true);builder.append(f.getName(), f.get(this));//builder.append(f.getName(), f.get(this)).append("\n");}} catch (Exception e) {builder.append("toString builder encounter an error");}return builder.toString();} }

也可以這樣使用:

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

5.結(jié)果對(duì)比

@Test public void testBaseDTO(){BaseDTO dto = new BaseDTO();dto.setCreateBy("createName");dto.setUpdatedBy("updateName");System.out.println(dto.toString()); } 第一種方法(append): me.zhengjie.base.BaseDTO@2fc14f68[createBy=createName,updatedBy=updateName,createTime=<null>,updateTime=<null>] 第二種方法(reflectionToString): me.zhengjie.base.BaseDTO@445b84c0[createBy=createName,updatedBy=updateName,createTime=<null>,updateTime=<null>]

兩種方法結(jié)果差不多,只是append方法更靈活,還可以在每次屬性添加后換行或者自定義字符串;而reflectionToString靜態(tài)方法簡(jiǎn)單直白。

總結(jié)

以上是生活随笔為你收集整理的通过ToStringBuilder实现toString方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。