Java Guava返回空数组或集合,而不是NULL

x33g5p2x  于2022-10-14 转载在 其他  
字(1.8k)|赞(0)|评价(0)|浏览(988)

将空集合优先于null是一个基本的java原则,它源于Effective java Item 43:返回空数组或集合,而不是null。有几个理由支持它:

  • 处理空值很糟糕
  • 代码可读性受损
  • 它很容易出错。开发人员很懒,消费者可能会忘记编写代码来处理null。
  • 方法签名表示它返回一个集合,null不是集合

Using and avoiding nulls在guava文档中有概述,但如果您查看了人们不遵守此规则的代码,它很快就会变得难看。不仅要处理NullPointerException,还要处理必须维护的冗长和额外代码。我在代码评审期间看到的几个示例:

List<String> someList = ...

if (someList != null && someList.size() > 0) {}

if (someList != null) {
    if (someList.isEmpty()){
    }
}

if (BooleanUtils.isTrue(someDomainObject.getSomeValue())) {}

if(StringUtils.isNotBlank(“some value”)){}

if(StringUtils.isBlank(“some value”)){}

返回空集合

实际上,每次返回空集合时,都应该返回相同的不可变空集合。我们将示例放在一起以供参考,返回空列表、返回空Map、返回空集、返回空枚举、返回空列表迭代器、返回空迭代器,返回空排序集和返回空排序Map。为了创建代码的一致性和可维护性,Guava和Apache实现了一种类似的方法来返回空列表。让我们看看返回空列表:

Java

@Test
public void return_empty_list_java () {


    List<String> emptyList = Collections.emptyList();

    assertTrue(emptyList.isEmpty());
}

guava

@Test
public void return_empty_list_guava () {

    List<String> emptyList = ImmutableList.of();

    assertTrue(emptyList.isEmpty());
}

Apache

@Test
public void return_empty_list_apache_commons () {

    @SuppressWarnings("unchecked")
    List<String> emptyList = ListUtils.EMPTY_LIST;

    assertTrue(emptyList.isEmpty());
}

规则的例外情况

目标是尽快处理从空到空的集合,并且没有理由编写返回集合或数组以返回空的方法。有时您会遇到一个返回null的方法,正确的做法是修复它,不要偷懒。由于大多数公司都没有一个专门负责重构代码的团队,没有一个有良好文档记录的代码库,也没有一个完全支持代码质量的管理人员,因此有几种方法可以处理它。

只需进行空检查

DomainObject domain = null;

List<String> strings;
if (domain != null && domain.getStrings() > 0) {
    strings = domain.getStrings();
} else {
    strings = Collections.emptyList();
}

使用Guava Objects.firstNonNull

DomainObject domain = null;

List<String> strings = Objects.firstNonNull(domain.getString(),
        ImmutableList.<String>of());

...

Apache通用CollectionUtils

DomainObject domain = null;

List<String> strings;
if (CollectionUtils.isEmpty(domain.getStrings())) {
    strings = domain.getStrings();
} else {
    strings = ListUtils.EMPTY_LIST;
}

相关文章