【问题标题】:Printing collection size or existance of a certain field using lombok使用 lombok 打印集合大小或某个字段的存在
【发布时间】:2021-02-22 23:13:43
【问题描述】:

我有这样的循环引用的对象:

@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() 将是一种耻辱案例。

【问题讨论】:

    标签: java annotations lombok


    【解决方案1】:

    是的,你可以;创建一个与字段同名的方法,该方法返回一个字符串。然后@ToString.Include 那一个,它将替换该字段。例如:

    @ToString.Include
    private String someCollection() {
        return "Collection(" + someCollection.size() + ")";
    }
    

    您可以将方法命名为其他名称,并通过 @ToString.Include 选项将名称设置为字段名称,如果您更喜欢将此方法称为 someCollectionToString 或其他名称。

    【讨论】:

    • 哇这好多了!
    【解决方案2】:

    我突然想到,我实际上可以添加一个附加所需文本的新方法,这太明显了,我感觉很糟糕。

    @Data
    class ClassA{
        private int someInt;
        @ToString.Exclude
        private List<ClassB> someCollection;
        
        public String deepToString(){
            return toString() + "ClassB Collection size: " + someCollection.size();
        }
    }
    

    我会留下这个问题以防万一有更好的方法,但这会做,因为这是一个非常罕见的情况。

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 2015-10-02
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多