gpt4 book ai didi

java - 为什么返回空集合被认为是好的做法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:50 25 4
gpt4 key购买 nike

我读了几本书,也看过几篇博客讨论返回空集合比返回 null 更好。我完全理解试图避免检查,但我不明白为什么返回一个空集合比返回 null 更好。例如:

public class Dog{

private List<String> bone;

public List<String> get(){
return bone;
}

}

对比

 public class Dog{

private List<String> bone;

public List<String> get(){
if(bone == null){
return Collections.emptyList();
}
return bone;
}

}

示例一将抛出 NullPointerException,示例二将抛出 UnsupportedOperation 异常,但它们都是非常通用的异常。是什么让一个比另一个更好或更差?

还有第三种选择是做这样的事情:

 public class Dog{

private List<String> bone;

public List<String> get(){
if(bone == null){
return new ArrayList<String>();
}
return bone;
}

}

但这样做的问题是您在您的代码中添加了其他人可能必须维护的意外行为。

我真的在寻找解决这个困境的方法。博客上的许多人倾向于只说它更好,而没有详细解释原因。如果返回不可变列表是最佳实践,我可以这样做,但我想了解为什么它更好。

最佳答案

如果您返回一个空集合(但不是必须 Collections.emptyList()),您可以避免使用无意的 NPE 让下游消费者感到惊讶。

这比返回 null 更可取,因为:

  • 消费者无需防范
  • 无论其中有多少元素,消费者都可以对集合进行操作

我说不一定 Collections.emptyList() 因为正如您所指出的,您正在用一个运行时异常换取另一个运行时异常,因为添加到此列表将不受支持并再次让消费者感到惊讶.

对此最理想的解决方案:字段的急切初始化。

private List<String> bone = new ArrayList<>();

下一个解决方案:让它返回一个 Optional 并在它不存在时做一些事情。如果需要,您也可以在此处提供空集合,而不是抛出。

Dog dog = new Dog();
dog.get().orElseThrow(new IllegalStateException("Dog has no bones??"));

关于java - 为什么返回空集合被认为是好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36779498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com