我目前正在替换所有标准 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;
}
您可以通过声明和初始化字段来实现这一点。初始化将在初始化封闭对象时完成。
private List<Object> list = new ArrayList();
Lomboks
@Getter
注释提供了一个属性lazy
,它允许延迟初始化。
@Getter(lazy=true) private final double[] cached = expensiveInitMethod();
我也有同样的问题。虽然上述答案在某些方面很有用,但确切的解决方案是使用 Lombok API 的
@Builder
和 @Singular
注释,如下面给出的代码所示。
它对我来说非常有效。
@Builder
class MyClass{
@Singular
private List<Type> myList;
}
这将使用非空 List 对象初始化 myList。不过,这个问题是老问题了。但是,仍然发布这个答案来帮助像我这样将来会提到这个问题的人。
如果提供具有相同名称和参数数量的 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;
}
更好的方法是使用 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;
一个老问题,但这个插件可以满足你的要求:
https://github.com/dmak/jaxb-xew-plugin
使用此插件生成的 getter 为:
public List<BaseVariableType> getVariables() {
if (variables == null) {
variables = new ArrayList<BaseVariableType>();
}
return variables;
}