使用 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 或其他。