【问题标题】:Checking for "nested" null attributes in Java检查 Java 中的“嵌套”空属性
【发布时间】:2017-01-13 11:26:00
【问题描述】:

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

public boolean isValid(){
     return session.getX() != null && session.getX().getY() != null &&
     session.getX().getY().getZ() != null;
}

这行得通,但是,有没有更优雅的方式来做到这一点?

非常感谢。

【问题讨论】:

标签: java nullpointerexception null boolean defensive-programming


【解决方案1】:

这行得通,但是,有没有更优雅的方式来做到这一点?

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

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

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

【讨论】:

【解决方案2】:

如果您使用的是 java 8,这种方式很优雅:

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

【讨论】:

    【解决方案3】:

    与 Dimitry 所说的类似,如果您使用 Java 8 并且可以控制 Session、X、Y 和 Z,那么您可以更改签名以返回 Optionals。

    您还可以使用方法引用来代替更易于阅读的 lambda。

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

    【讨论】:

    • 是的,引用很好,但我们不知道问题中的实际类名,此外,您应该在所有映射中删除“()”以避免编译错误。
    猜你喜欢
    • 2015-03-07
    • 2018-06-13
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多