声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635
Java POJO在日志中常会用于打印,经常会将POJO的内容全部或部分打印出来,所以POJO类的toString()方法常要重写。
现在举一个例子
package com.test.lang;
public class SelfDefinedToString
{
String name;
int age;
String country;
String occupation;
@Override
public String toString() {
return "SelfDefinedToString{" +
"name='" + name + '\'' +
", age=" + age +
", country='" + country + '\'' +
", occupation='" + occupation + '\'' +
'}';
}
}
如果直接使用IDEA默认的自动代码生成器生成toString(),可能如上所示,其中使用了大量的字符串拼接,这样会产生很多的临时字符串对象,如果打印很多的话,对效率有不良影响。当然,IDEA已经给了我们一些备选项。如下图所示
IDEA自带的这些toString()生成模板,其实也透露出了一些语法规则。然后可以自己写一个模板出来。
/**
* {@inheritDoc}
*/
@Override
public java.lang.String toString()
{
final java.lang.StringBuilder sb = new java.lang.StringBuilder("$classname").append('[')
#set ($i = 0)
#foreach ($member in $members)
#if ($i == 0)
#if ($member.string)
.append("$member.name=")
#else
.append("$member.name=")
#end
#else
#if ($member.string)
.append(",$member.name=")
#else
.append(",$member.name=")
#end
#end
#if ($member.primitiveArray)
if ($member.name == null)
.append("null")
else {
.append('[');
for (int i = 0; i < $member.name .length; ++i)
.append(i == $member.name .length -1 ? "" : ", ").append($member.name [i])
.append(']');
}
#elseif ($member.objectArray)
.append($member.name == null ? "null" : java.util.Arrays.asList($member.name).toString())
#elseif ($member.string)
.append($member.accessor)
#else
.append($member.accessor)
#end
#set ($i = $i + 1)
#end
.append(']');
return sb.toString();
}
再看生成的代码
package com.test.lang;
public class SelfDefinedToString
{
String name;
int age;
String country;
String occupation;
/**
* {@inheritDoc}
*/
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("SelfDefinedToString").append('[')
.append("name=")
.append(name)
.append(",age=")
.append(age)
.append(",country=")
.append(country)
.append(",occupation=")
.append(occupation)
.append(']');
return sb.toString();
}
}
其实自动生成器的模板可以跟着例子调成自己想要的样子。主要是要学会举一反三。