Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查“是否存在”;嵌套的;Java中的空属性_Java_Nullpointerexception_Null_Boolean_Defensive Programming - Fatal编程技术网

检查“是否存在”;嵌套的;Java中的空属性

检查“是否存在”;嵌套的;Java中的空属性,java,nullpointerexception,null,boolean,defensive-programming,Java,Nullpointerexception,Null,Boolean,Defensive Programming,我有一个简单的方法来检查属性中没有null: public boolean isValid(){ return session.getX() != null && session.getX().getY() != null && session.getX().getY().getZ() != null; } 这是可行的,但是,有没有更优雅的方式呢 先谢谢你 这是可行的,但是,有没有更优雅的方式呢 使用执行反射以检索嵌套字段并执行检查的实用程序

我有一个简单的方法来检查属性中没有
null

public boolean isValid(){
     return session.getX() != null && session.getX().getY() != null &&
     session.getX().getY().getZ() != null;
}
这是可行的,但是,有没有更优雅的方式呢

先谢谢你

这是可行的,但是,有没有更优雅的方式呢

使用执行反射以检索嵌套字段并执行检查的实用程序类,它可能更优雅,但肯定不太安全且速度较慢:

public boolean isValid(){
     return NullAnalyser.isNotNull(session, "x.y.z");
}

另一个想法是返回一个特殊类型,允许在getter中避免NPE。但这使它们更加复杂。它是否理想?

如果您使用java 8,这种方式非常优雅:

public boolean isValid(){
     return Optional.of(session)
                    .map(x -> x.getX())
                    .map(x -> x.getY())
                    .map(x -> x.getZ())
                    .isPresent());
}

与Dimitry所说的类似,如果您使用Java8并控制会话、X、Y和Z,那么您可以更改签名以返回选项

您还可以使用方法引用,而不是lambda,后者可以说更易于阅读

public boolean isValid(){
     return Optional.of(session)
                    .map(Session::getX)
                    .map(X::getY)
                    .map(Y::getZ)
                    .isPresent());
}

感谢您的回答@davidxxx。我也在思考,但如果可能的话,我希望有一个现有的图书馆,以避免“重新发明轮子”,欢迎您。小海狸应该做这项工作。例如
BeanUtils.getProperty(会话,“x.y.z”)
它看起来像是代码气味,违反了可能与字段重复的,不允许它为空的责任随之而来。是的,引用很好,但我们不知道问题中的实际类名,而且您应该删除所有映射中的“()”以避免编译错误。