如果使用 lombok getter 列表为空,则初始化列表?

Initialize list if list is null with lombok getter?

我目前正在替换我所有的标准 POJO,以将 Lombok 用于所有样板代码。我发现自己为列表保留 getters,因为如果列表尚未初始化,我想 return 一个空列表。也就是说,我不希望 getter 到 return 为空。如果有一些我不知道的龙目岛魔法可以帮助我避免这样做?

生成的代码示例

private List<Object> list;
public Object getList(){ return list; }

我想要的是:

private List<Object> list;
public Object getList(){
    if (list == null) {
        return new ArrayList();
    }
    return list;
}

您可以通过声明和初始化字段来实现。初始化将在封闭对象初始化时完成。

private List<Object> list = new ArrayList();

Lomboks @Getter 注释提供了一个允许延迟初始化的属性 lazy

 @Getter(lazy=true) private final double[] cached = expensiveInitMethod();

Documentation

如果 getter 方法具有相同的名称和参数数量,则最新版本的 lombok 不会生成 getter 方法。

对于旧版本的 lombok,您可以通过在字段中使用 AccessLevel.NONE 来用您喜欢的任何内容覆盖 getter。

请注意,仅初始化该字段并不能保护您免受客户端调用带空值的构造函数或调用带空值的 setter 的影响(仍然可能没问题,具体取决于您的需要)。

例如

// only necessary for older versions of lombok
@Getter(AccessLevel.NONE)
private Map<String, String> params;

public Map<String, String> getParams() {
    return (params == null) ? new HashMap<>() : params;
}

我有和这个问题一样的问题。虽然,以上答案在某些方面很有用,但确切的解决方案是像下面给定的代码一样使用 Lombok API 的 @Builder and @Singular 注释。

它对我来说效果很好。

@Builder
class MyClass{
    @Singular
    private List<Type> myList;
}

这将使用非空列表对象初始化 myList。虽然,这个问题是一个古老的问题。但是,仍然发布此答案以帮助像我这样的人将来会参考此问题。

一个老问题,但是这个插件可以满足你的要求:

https://github.com/dmak/jaxb-xew-plugin

使用此插件生成 getter 为:

public List<BaseVariableType> getVariables() {
    if (variables == null) {
        variables = new ArrayList<BaseVariableType>();
    }
    return variables;
}