假设我有一个类订单,其中包含一个对象项目,又包含一个对象类别,它又包含一个字符串CategoryName
。
现在,我想从这些嵌套对象中提取类别名称,只有这些中间对象都不是null。
class Order {
Item item;
public Item getItem() {
return item;
}
}
class Item {
Category category;
public Category getCategory() {
return category;
}
}
class Category {
String categoryName;
public String getCategoryName() {
return categoryName;
}
}
我通常最终写作的代码是:
if (order != null && order.getItem() != null && order.getItem().getCategory() != null
&& order.getItem().getCategory().getCategoryName() != null) {
System.out.println("Category Name is present and is " + order.getItem().getCategory().getCategoryName());
}
是否有更好的方法来检查此问题,而不是再次调用每个Getters。
喜欢检查getCategoryName()
是否为null,我必须致电getItem().getCategory()
,因此我最终在涉及多个对象的情况下经常打电话给这些先前的getter。
另一种方法是在其零检查后创建一个项目变量,然后创建类别的变量,依此类推。
但是有更好的方法吗?
是否有更好的检查方法,
是的,使用不变的对象并将值传递为构造函数参数。
class Order {
private final Item item;
// check Item being not null _before_ creating an order object.
public Order(Item item){
this.item= item;
}
public Item getItem() {
return item;
}
}
这样,Getter无法返回null
。
尝试使用可选的。
Optional<String> optionalCategoryName = Optional.ofNullable(order).map(Order::getItem)
.map(Item::getCategory).map(Category::getCategoryName);
if (optionalCategoryName.isPresent()) {
System.out.println("Category Name is present and is " + optionalCategoryName.get());
}
您可以通过消除再次致电这些先前的getters来使用地图并嵌套子对象。它还使您的代码看起来更可读。
注意:这起作用 Java 8 ,在我猜Guava可选之前应以类似的方式工作。
您始终可以获取使用类别名称以供使用,如果获得的通话链会导致无效的指针例外,请立即捕获该异常并处理情况。这样,您的代码就可以进行以下假设,即一切都可以正常工作而不会浪费周期检查,然后如果发生某些事情,它会优雅地失败。