使用 lombok 打印集合大小或某个字段的存在
Printing collection size or existance of a certain field using lombok
我有这样的循环引用对象:
@Data
class ClassA{
private int someInt;
private List<ClassB> someCollection;
}
@Data
class ClassB{
private int someInt;
private ClassA someInstance;
}
因此,每当我对具有循环引用的对象执行 toString()
时,堆栈就会如您所料溢出。
到目前为止,我可以像这样使用 @lombok.ToString.Exclude
来防止这种情况:
@Data
class ClassA{
private int someInt;
@ToString.Exclude
private List<ClassB> someCollection;
}
或者也像这样:
@Data
class ClassB{
private int someInt;
@ToString.Exclude
private ClassA someInstance;
}
然而,这给我留下了隐藏一些关键调试信息的对象。
有没有办法使用注释来获取有关字段的信息,而不是字段本身?
例如:
@Data
class ClassA{
private int someInt;
@ToString.CollectionSize //this could print someCollection.getSize()=n
private List<ClassB> someCollection;
}
或喜欢:
@Data
class ClassB{
private int someInt;
@ToString.IsNull // this could be someInstance.isNull()=false
private ClassA someInstance;
}
或者有没有一种简单的方法可以将行为附加到 lombok 的 toString()
只是 lombok 真的非常非常有用......而且不得不覆盖整个 toString()
在这些情况下。
我突然想到我实际上可以添加一个新方法来附加所需的文本,这太明显了,我感觉很糟糕。
@Data
class ClassA{
private int someInt;
@ToString.Exclude
private List<ClassB> someCollection;
public String deepToString(){
return toString() + "ClassB Collection size: " + someCollection.size();
}
}
我将保留这个问题,以防万一有更好的方法,但这会做,因为这是一个非常罕见的情况。
是的,你可以;创建一个与字段同名的方法,returns 一个字符串。然后 @ToString.Include
那个,它将替换该字段。例如:
@ToString.Include
private String someCollection() {
return "Collection(" + someCollection.size() + ")";
}
您可以将方法命名为其他名称,并通过 @ToString.Include
选项将名称也设置为字段名称,如果您更喜欢调用此方法 someCollectionToString
或其他。
我有这样的循环引用对象:
@Data
class ClassA{
private int someInt;
private List<ClassB> someCollection;
}
@Data
class ClassB{
private int someInt;
private ClassA someInstance;
}
因此,每当我对具有循环引用的对象执行 toString()
时,堆栈就会如您所料溢出。
到目前为止,我可以像这样使用 @lombok.ToString.Exclude
来防止这种情况:
@Data
class ClassA{
private int someInt;
@ToString.Exclude
private List<ClassB> someCollection;
}
或者也像这样:
@Data
class ClassB{
private int someInt;
@ToString.Exclude
private ClassA someInstance;
}
然而,这给我留下了隐藏一些关键调试信息的对象。
有没有办法使用注释来获取有关字段的信息,而不是字段本身? 例如:
@Data
class ClassA{
private int someInt;
@ToString.CollectionSize //this could print someCollection.getSize()=n
private List<ClassB> someCollection;
}
或喜欢:
@Data
class ClassB{
private int someInt;
@ToString.IsNull // this could be someInstance.isNull()=false
private ClassA someInstance;
}
或者有没有一种简单的方法可以将行为附加到 lombok 的 toString()
只是 lombok 真的非常非常有用......而且不得不覆盖整个 toString()
在这些情况下。
我突然想到我实际上可以添加一个新方法来附加所需的文本,这太明显了,我感觉很糟糕。
@Data
class ClassA{
private int someInt;
@ToString.Exclude
private List<ClassB> someCollection;
public String deepToString(){
return toString() + "ClassB Collection size: " + someCollection.size();
}
}
我将保留这个问题,以防万一有更好的方法,但这会做,因为这是一个非常罕见的情况。
是的,你可以;创建一个与字段同名的方法,returns 一个字符串。然后 @ToString.Include
那个,它将替换该字段。例如:
@ToString.Include
private String someCollection() {
return "Collection(" + someCollection.size() + ")";
}
您可以将方法命名为其他名称,并通过 @ToString.Include
选项将名称也设置为字段名称,如果您更喜欢调用此方法 someCollectionToString
或其他。