如何避免检查方法链中的空值?

这个问题在这里已经有了答案:

  • 空检查链与捕获NullPointerException 19个答案
  • 避免!= null语句58个答案

  • 不,在Java中通常不是很好的做法来捕获NPE,而不是空值检查您的引用。

    如果您愿意,您可以使用Optional来处理这类事情:

    if (Optional.ofNullable(country)
                .map(Country::getCity)
                .map(City::getSchool)
                .map(School::getStudent)
                .isPresent()) {
        isValid = true;
    }
    

    或干脆

    boolean isValid = Optional.ofNullable(country)
                              .map(Country::getCity)
                              .map(City::getSchool)
                              .map(School::getStudent)
                              .isPresent();
    

    你可以在这里使用Optional ,但是它在每一步创建一个Optional对象。

    boolean isValid = Optional.ofNullable(country)
        .map(country -> country.getCity()) //Or use method reference Country::getCity
        .map(city -> city.getSchool())
        .map(school -> school.getStudent())
        .map(student -> true)
        .orElse(false);
    
    //OR
    boolean isValid = Optional.ofNullable(country)
                          .map(..)
                          ....
                          .isPresent();
    

    面向对象的方法是将isValid方法放在Country和其他类中。 它不会减少空值检查的数量,但每种方法只有一个,并且不会重复它们。

    public boolean isValid() {
      return city != null && city.isValid();
    }
    

    这有一个假设,即验证在您所在国家/地区的任何地方都是相同的,但通常情况就是这样。 如果没有,该方法应该被命名为hasStudent(),但这不是一般的,你可能会冒着复制Country中的整个学校接口的风险。 例如,在另一个地方,您可能需要hasTeacher()或hasCourse()。

    另一种方法是使用空对象:

    public class Country {
      public static final Country NO_COUNTRY = new Country();
    
      private City city = City.NO_CITY;
    
      // etc.
    }
    

    我不确定这种情况是否可取(严格地说,您需要一个子类来覆盖所有修改方法),但Java 8的方法是在其他答案中使用Optional作为方法,但我会建议采用它更充分:

    private Optional<City> city = Optional.ofNullable(city);
    
    public Optional<City> getCity() {
       return city;
    }
    

    如果你总是使用它们而不是null(注意字段初始化),那么null对象和Nullable都是有效的,否则你仍然需要null检查。 所以这个选项避免了null,但是你的代码变得更加冗长以减少其他地方的空检查。

    当然,正确的设计可能是在可能的情况下使用集合(而不是可选)。 一个国家有一套城市,城市有一套学校,有一套学生等等。

    链接地址: http://www.djcxy.com/p/13291.html

    上一篇: How to avoid checking for null values in method chaining?

    下一篇: What are the replacements for legacy collections `Stack` and `Properties`?