大家好,我是北君。我们平时工作的时候,经常会用到toString()方法来输出一个对象的一些属性信息。Lombok为我们提供了自动生成toString()代码的注解,可以减少代码行数。如果代码属性比较多,可以避免我们的代码在处理过程中出现属性缺失的问题。在这篇文章中,我们将谈谈Lombok的@ToString()相关内容,以便我们以后更好的使用Lombok。要使用Lombok,首先我们添加maven依赖项。org.projectlomboklombok1.18.22provided然后我们创建一个Account类让我们演示我们的各种操作。@Getter@Setter@ToStringpublicclassAccount{privateStringid;privateStringname;}默认情况下,我们调用Account的toString()方法后,可能输出如下:Account(id=12345,name=account)是比较标准的格式输出。Lombok的配置父类toString()调用现在假设我们有一个SavingAccount类继承自Account,当我们调用SavingAccount的toString()方法时,我们希望输出Account的一些属性,这时候我们可以设置callSupper属性来达到我们的目的.@ToString(callSupper=true)publicclassSavingAccountextendsAccount{privateStringsavingAccountId;//省略上面代码的操作,输出父类Account的所有属性:SavingAccount(super=Account(id=12345,name=Anaccount),savingAccountId=6789)省略字段名我们知道默认输出会包含字段名,我们可以通过设置includeFieldNames来控制是否显示属性名。@ToString(includeFieldNames=false)publicclassAccount{privateStringid;私有字符串名称;//omitgetset}将includeFieldNames设置为false后,输出如下Account(12345,Anaccount)使用字段而不是Getters我们知道getter方法提供字段值用于打印。如果该类不包含特定字段的getter方法,则Lombok将直接访问该字段并获取其值。我们可以通过将doNotUseGetters属性设置为true,将Lombok配置为始终使用直接字段值而不是getter。@ToString(doNotUseGetters=true)publicclassAccount{privateStringid;私有字符串名称;//忽略getterpublicStringgetId(){return"thisistheid:"+id;}//标准getters和setters}如果没有这个属性,我们将通过调用getters获得输出。Account(id=thisistheid:12345,name=Anaccount)相反,通过设置doNotUseGetters属性,输出实际上显示了id字段的值,而无需调用getter。Account(id=12345,name=Anaccount)字段的包含和排除假设我们要从字符串表示中排除某些字段,例如密码、其他敏感信息或大型JSON结构。我们可以通过@ToString.Exclude注解来省略这些字段。让我们从我们的表示中排除名称字段@ToStringpublicclassAccount{privateStringid;@ToString.ExcludeprivateStringname;}或者,我们可以只指定输出中需要的字段,我可以通过使用@ToString(onlyExplicitlyIncluded=true)和@ToString.Include来实现。@ToString(onlyExplicitlyIncluded=true)publicclassAccount{@ToString.IncludeprivateStringid;私有字符串名称;}以上两种方式在最终输出中只能输出id字段。Account(id=12345)另外,Lombok会自动忽略以$开头的变量,但是我们可以通过@ToString.Include来强制Lombok输出。输出排序默认情况下,Lombok的输出按照字段定义的顺序输出。我可以通过设置@ToString.Include来排序。我们先修改Account的字段顺序,然后标记id的顺序。@ToStringpublicclassAccount{私有字符串名称;@ToString.Include(rank=1)privateStringid;}现在在输出id字段的时候,会在Lombok输出的nameAccount(id=12345,name=Anaccount)前面规则大致如下:等级越高,排名越高。默认排序值为0,按照字段定义顺序输出方法输出相同的排序。除了字段之外,我们还可以包括不需要参数的实例方法的输出。我们可以通过使用@ToString.Include标记无参数实例方法来做到这一点。@ToStringpublicclassAccount{privateStringid;私有字符串名称;@ToString.IncludeStringdescription(){return"账户描述";}}这里的描述会作为输出键打印出来。Account(id=12345,name=Anaccount,description=Accountdescription)如果指定的方法名与字段名匹配,则方法优先于字段。换句话说,输出包含方法调用的结果,而不是匹配字段的值。修改字段名我们可以通过@ToString.Include的属性来修改字段名。@ToStringpublicclassAccount{@ToString.Include(name="identification")privateStringid;privateStringname;}现在输出结果中不会包含字段名id,输出标识。Account(identification=12345,name=Anaccount)打印一个数组Lombok使用Arrays.deepToString()方法打印一个数组,该方法将数组元素转换为其相应的字符串表示形式。但是数组可能包含直接引用或间接循环引用。为避免无限递归及其关联的运行时错误,此方法将从自身内部呈现对数组的任何循环引用为“[[...]]”。让我们通过将一个对象数组字段添加到我们的帐户类来进行查看。@ToStringpublicclassAccount{privateStringid;privateObject[]relatedAccounts;}relatedAccounts数组打印如下Account(id=12345,relatedAccounts=[54321,[...]])重要的是通过deepToString()方法检测并正确删除了循环引用由Lombok渲染而不会引发任何StackOverflowError。有一些注意事项和一些值得一提的细节对于避免意外结果很重要。如果类中存在任何名为toString()的方法(无论返回类型如何),Lombok将不会生成其toString()方法。不同版本的Lombok可能会改变生成方法的输出格式。在任何情况下,我们都应该避免依赖解析toString()方法输出的代码。所以这真的应该不是问题。我们也可以在枚举上添加这个注解。这将生成枚举值的表示形式,后跟枚举类名称,例如,AccounType.SAVING。