【问题标题】:Lombok inner collection initializationLombok 内部集合初始化
【发布时间】:2017-02-15 15:23:12
【问题描述】:

我使用 Lombok @Value 注释。是否有可能以某种方式确保内部集合永远不会为空?

例子:

package com.testapp;

import lombok.Value;
import lombok.experimental.Wither;

import java.util.List;

@Value
@Wither
public final class ClassWithList {

    private final List<String> list;

    public void printList() {
        list.forEach(System.out::println);
    }

}

如果list 为空,这将抛出NullPointerException。我目前的策略是永远不允许发生,内部集合可能为空,它在构造函数 (setter, builder...) 中进行了清理。但是在这种情况下,Lombok 会自动生成构造函数。有什么办法,如何确保list 属性始终至少初始化为一个空集合,还是我必须开始编写繁琐的空检查?

【问题讨论】:

    标签: java lombok


    【解决方案1】:

    如果您传入的列表有可能为空,您可以覆盖构造函数

    public ClassWithList(List<String> aList) {
      this.list = aList == null ? new ArrayList<>() : aList;
    }
    

    来自 Project Lombok(重点是我的):Value

    @Value 是以下的简写:final @ToString @EqualsAndHashCode @AllArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter,除了显式包含 任何的相关方法只是意味着不会生成该部分并且不会发出警告

    【讨论】:

    • 出于某种原因,我认为不可能声明由 Lombok 生成的方法。
    【解决方案2】:

    注释 @lombok.NonNull 可以解决问题:

    @NonNull    
    private final List<String> list;
    

    这会在构造函数和设置器中生成以下代码:

    if (list == null)
      throw new NullPointerException("list is marked @NonNull but is null"); 
    

    【讨论】:

      猜你喜欢
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2020-05-10
      • 2018-10-05
      • 2017-08-30
      相关资源
      最近更新 更多