避免针对POJO/Javabean的集合字段进行NPE的最佳实践是什么?

避免针对POJO/Javabean的集合字段进行NPE的最佳实践是什么?,java,nullpointerexception,javabeans,pojo,Java,Nullpointerexception,Javabeans,Pojo,假设我有一个带有集合字段的POJO/Java Bean类: 每个集合字段是否需要1? 哪一个更好,2.a还是2.b?为什么?Guava选择了2.a,比如Fluentitable.fromnull,但它不是POJO/Javabean。 POJO/JavaBean是否有避免NPE的最佳实践或原则?我认为修改后的代码不再是setter中某些逻辑代码的POJO。 谢谢 初始化声明中的字段。请注意,您的代码无法编译-无法实例化列表,请尝试: 原因是: 实例化一个列表非常便宜 这是完成任务所需的最少代码 延

假设我有一个带有集合字段的POJO/Java Bean类:

每个集合字段是否需要1? 哪一个更好,2.a还是2.b?为什么?Guava选择了2.a,比如Fluentitable.fromnull,但它不是POJO/Javabean。 POJO/JavaBean是否有避免NPE的最佳实践或原则?我认为修改后的代码不再是setter中某些逻辑代码的POJO。
谢谢

初始化声明中的字段。请注意,您的代码无法编译-无法实例化列表,请尝试:

原因是:

实例化一个列表非常便宜 这是完成任务所需的最少代码 延迟初始化的最大问题是线程安全——它需要特殊的代码
这个问题不是发生在setter中,而是发生在getter中

1可能会导致很大的开销,因为某些列表实现具有支持数据容器(如ArrayList)的初始大小

2没有意义,因为您仍然会遇到异常。这并不能解决问题

3是正确的方法,但不是在二传手!将其放入getter中:

if(this.barList==null){
  this.barList = new LinkedList<Bar>();
}
使用


一般来说,当您有一个返回列表的getter方法时,最好返回空列表而不是null值。

您可以使用特殊情况null并返回空列表

public List<Bar> getBarList() {
    return barList != null ? barList : Collections.<Bar>emptyList();
}
或者你可以从空列表开始

  private List<Bar> barList = Collections.<Bar>emptyList();

2和3不解决任何问题,因为无法确保在调用getter之前调用settercalled@Anderson我已经删除了我的评论,但你的说法是错误的。this.barList与barList是不同的变量,并导致setter方法的不同行为。getBarList可能返回null,但永远不会抛出NPE@Anderson删除断言,默认情况下,它们在Java中未启用。如果你真的想避免所有的麻烦:在FoO实例化中实例化列表,并且不允许SETUT设置空值。有许多因素使设计合理或无用。没有一种适合所有客户的解决方案可以避免NPE。大多数时候,你并不幸运地从头开始创建一个设计,你可以首先应用模式。大多数情况下,你必须用你得到的东西来工作。include不能返回不可变列表,或者客户端在语义上依赖NULL…我宁愿使用java.util.Collections.emptyList,而不是创建新列表。问题其实并不在getter中,也不在getter结果可能被使用的地方。谁说“null”无效?@hinneLinks为什么?这将限制您操作列表。您无法调用新列表。。。另外,延迟创建可能会带来并发性问题。@Fildor如果你是对的,当然你需要List的实现。是的,这些问题是有效的。但不在我回答的范围内:如果setBarListnull会被调用,那会是什么呢?那么他也得检查一下,伊姆霍。@Fil最好删除setter。这没有道理,因为其他客户会期望他们添加的东西仍然存在,我同意。不过,你应该在回答中加入这一点。我并不认为这是理所当然的。谢谢你指出我在ArrayList中的错误,我已经更新了它。比如说我必须保留二传手。此外,您的意思是删除集合字段的setter是最佳做法吗?emptyList不是不可变的吗?@Fildor-是的-这会有问题吗?@OldCurmudgeon抱歉,不可变列表无法接受,因为调用方可能会执行egetbarlist.addaBar;由于同样的原因,两者都不能是getter中的可变空列表。或者您的意思是POJO必须是不可变的?这将无法编译。我同意Stultuske的观点,他认为在这里更好地使用这个词。Null可能具有语义含义。因此,返回空集合而不是null并不总是更好。特别是在更改遗留代码时,您可以通过这种方式阻止应用程序逻辑。@Fildor是的,我正在处理一些遗留代码。我确信在这种情况下,NULL没有语义意义。我应该告诉你更多关于它的背景,再一次为此感到抱歉。
if(this.barList==null){
  this.barList = new LinkedList<Bar>();
}
private List<Bar> barList = new List<Bar>();
public List<Bar> getBarList() {
    return barList != null ? barList : Collections.<Bar>emptyList();
}
  private List<Bar> barList = Collections.<Bar>emptyList();