如何避免检查方法链中的空值?
这个问题在这里已经有了答案:
不,在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`?