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

问题描述 投票:0回答:5

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

生成代码示例

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

我想要什么:

private List<Object> list;
public Object getList(){
    if (list == null) {
        return new ArrayList();
    }
    return list;
}
java java-8 lombok
5个回答
31
投票

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

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

Lomboks

@Getter
注释提供了一个属性
lazy
,它允许延迟初始化。

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

文档


23
投票

我也有同样的问题。虽然上述答案在某些方面很有用,但确切的解决方案是使用 Lombok API 的

@Builder
@Singular
注释,如下面给出的代码所示。

它对我来说非常有效。

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

这将使用非空 List 对象初始化 myList。不过,这个问题是老问题了。但是,仍然发布这个答案来帮助像我这样将来会提到这个问题的人。


4
投票

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

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

请注意,仅仅初始化字段并不能保护您免受客户端调用带有 null 的构造函数或调用带有 null 的 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;
}

0
投票

更好的方法是使用 setter 而不是 getter!这样变量中就永远不会有 null 的机会! (除了反射的东西......)

在我的示例中,我有一个成员列表...

public void setMembers(List<Member> members) {
    this.members = members != null ? members : new ArrayList(10);
}

注意:如果您使用 Hibernate 和 Jpa 并使用 getter 变体,这可能会导致您的列表在从数据库加载对象时被框架设置为 null,getter 将为您提供一个空列表,但对象中的代码可以仍然获得 NPE。

我还想纠正一些其他答案:

如果您使用 getter 变体,请勿使用三元运算符!:

return (list == null) ? new ArrayList<>() : list;

为什么?因为你从来没有将新的ArrayList设置给对象var!如果有人想要操纵列表,这可能会产生错误!改为这样做:

if (list == null) {
    list = new ArrayList<>();
}
return list;

-1
投票

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

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

使用此插件生成的 getter 为:

public List<BaseVariableType> getVariables() {
    if (variables == null) {
        variables = new ArrayList<BaseVariableType>();
    }
    return variables;
}
© www.soinside.com 2019 - 2024. All rights reserved.