实体类转String(即重写toString方法)的N种方式

 类如下:

public class BosBaseObject implements Serializable {
    private String createBy;
    private Long createDate;
    private String updateBy;
    private Long updateDate;
}

一、直接使用(不重写)

打印的数据只有类的hashCode,并没有将类中的数据打印出来

BosBaseObject baseObject = new BosBaseObject();
baseObject.setCreateBy("RegisterInit");
baseObject.setUpdateBy("RegisterInit");
System.out.println(baseObject);
log.info("数据为:{}", baseObject);
com.****.model.BosBaseObject@62ddbd7e
[2021-12-28 13:40:59.606][INFO ][biz_seq:][com.****.controller.OneController-77][数据为:com.****.model.BosBaseObject@62ddbd7e]

因为没有重写toString()方法,直接继承了Object类的toString()方法如下:

public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

二、手动拼接数据

@Override
public String toString() {
	return "BosBaseObject{" +
			"createBy='" + createBy + '\'' +
			", createDate=" + createDate +
			", updateBy='" + updateBy + '\'' +
			", updateDate=" + updateDate +
			'}';
}
BosBaseObject{createBy='RegisterInit', createDate=null, updateBy='RegisterInit', updateDate=null}

 三、使用JSONObject

@Override
public String toString() {
	return JSONObject.toJSONString(this);
}
{"createBy":"RegisterInit","updateBy":"RegisterInit"}

 四、使用ToStringBuilder

String str = ReflectionToStringBuilder.toString(baseObject, ToStringStyle.SHORT_PREFIX_STYLE);

不同的Style打印的格式不一样,如下

//ToStringStyle.DEFAULT_STYLE
com.phfund.aplus.ajds.db.common.persistence.model.BosBaseObject@62ddbd7e[createBy=RegisterInit,createDate=<null>,updateBy=RegisterInit,updateDate=<null>]
//ToStringStyle.SHORT_PREFIX_STYLE
BosBaseObject[createBy=RegisterInit,createDate=<null>,updateBy=RegisterInit,updateDate=<null>]
//ToStringStyle.SIMPLE_STYLE
RegisterInit,<null>,RegisterInit,<null>
//ToStringStyle.MULTI_LINE_STYLE
com.phfund.aplus.ajds.db.common.persistence.model.BosBaseObject@62ddbd7e[
  createBy=RegisterInit
  createDate=<null>
  updateBy=RegisterInit
  updateDate=<null>
]
//ToStringStyle.NO_FIELD_NAMES_STYLE
com.phfund.aplus.ajds.db.common.persistence.model.BosBaseObject@62ddbd7e[RegisterInit,<null>,RegisterInit,<null>]

五、使用ReflectionToStringBuilder,效果同上

String str = ReflectionToStringBuilder.toString(baseObject,ToStringStyle.SHORT_PREFIX_STYLE);

使用setExcludeFieldNames实现指定某些字段不输出(比如隐藏password)

String str = new ReflectionToStringBuilder(this,ToStringStyle.SHORT_PREFIX_STYLE).setExcludeFieldNames(new String[]{"createBy","createDate"}).toString();
BosBaseObject[updateBy=RegisterInit,updateDate=<null>]

六、使用lombok中的ToString注解

具体参看https://blog.csdn.net/WZH577/article/details/100164550

SQL 查询后的结果类并不一定非要重写 `toString` 方法,但这通常是推荐的做法。下面详细解释一下原因: --- ### 为什么建议重写 `toString` 方法? 1. **便于调试** 当你在程序运行过程中需要打印 SQL 查询的结果时(例如通过日志记录或简单的 System.out.println 调试),如果没有重写 `toString` 方法,默认会显示类似 `[Ljava.lang.Object;@hashcode` 的内容,这很难直观地理解数据的具体值。 2. **提高可读性** 如果重写了 `toString` 方法,可以自定义输出格式,使得每个字段都清晰可见。这对于复杂的数据结构尤其重要。 3. **方便集成其他工具** 某些框架、库或者可视化工具可能会依赖于对象的字符串表示形式。如果未重写方法,则可能导致这些工具无法正常工作或者难以解读返回的信息。 4. **一致性维护** 统一为所有实体类添加有意义的 `toString()` 实现有助于保持项目的整洁性和标准化。 --- ### 那么是否强制要求呢? 并非强制性的需求,但如果希望代码更易于理解和管理的话,最好还是对其进行适当的覆盖处理。以下是几个场景分析: #### 场景 1 - 简单测试用途 如果你只是临时用于验证某些功能,并不需要特别关注最终用户界面呈现效果的情况下,也许可以直接忽略这一操作步骤; #### 场景 2 - 生产环境下的应用 一旦进入实际项目部署阶段后,为了保证良好的用户体验以及后续技术支持人员排查问题便利性等方面考虑,在这种环境下应该尽可能完善此类细节设计包括但不限于重载 toString() 函数等措施. --- ### 示例代码 ```java public class User { private int id; private String name; // Getter & Setter methods here... @Override public String toString(){ return "User [id=" + id + ", name=" + name + "]"; } } ``` 如上所示示例,当创建一个新的 `User` 对象并试图将其换成字符串时将得到类似于 `"User[id=1,name=Alice]"` 这样的易懂表述而非原始地址指针信息了! --- ### 总结 虽然技术层面来说并没有规定说一定要对 SQL 结果集对应的 POJO 类型进行额外设置才允许正常使用它们的功能特性——但是从工程实践的角度出发,养成良好习惯对于长远发展而言是非常必要的!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值