【问题标题】:How to check if object and nested fields are null [duplicate]如何检查对象和嵌套字段是否为空[重复]
【发布时间】:2017-08-08 23:16:20
【问题描述】:

我有一个对象,我想检查这个对象或嵌套字段是否为空。我想打印这个网域,但我应该检查某个级别是否有空值,否则我会得到空指针异常。

我知道我可以做到:

if( object != null && object.A != null && object.A.B != null && object.A.B.C != null && object.A.B.C.D != null) { doSomething( object.A.B.C.D);}

但它太长了。你知道更好的检查方法吗?

【问题讨论】:

  • 您可以尝试将嵌套字段插入到数组中,然后对数组中的每个对象运行空值检查,但我认为实际考虑这样做太复杂了。但这是一种可能。
  • 防止它们为空。使用 NullObject 模式/范例。 en.wikipedia.org/wiki/Null_Object_pattern#Java 或 Axel sais vvv
  • 好吧,如果这是一个复杂的嵌套数据,那么在这个结束时做一个检查并捕获NPE,如果发生异常,它是无效的。使用异常不是一个好主意,但在某些“异常”中,我想这更容易
  • 您可以切换到Groovy 并执行if (object?.A?.B?.C?.D) { doSomething( object.A.B.C.D);}
  • 毕竟,不得不进行 4 次间接访问是一种代码味道……

标签: java variables object field


【解决方案1】:

您可以使用返回所有子对象的方法在所有对象上实现一个接口,并创建一个递归调用自身以验证所有对象都已设置的方法。

【讨论】:

    【解决方案2】:

    假设这是一个防止滥用方法的检查,所以这种情况不应该发生太多次。

    只需捕获此异常,这将使值无效。

    private boolean isValid(YourObject object){
        try{
             return object.A.B.C.D != null;
        } catch (NullPointerException npe){
            return false;
        }
    }
    

    当然,如果您进行大量验证并且经常返回 false,请不要使用此解决方案,异常是一个繁重的过程。

    编辑:

    正如 Fildor 指出的那样,即使没有例外,使用 try-catch 也是有代价的。但是使用这个answer 我可以假设这将是有限的,并且在这条独特的线路上没有太多优化。

    【讨论】:

    • 但异常不仅发生时代价高昂。单独的 try/catch 的存在已经触发了成本。
    • 嗯,那可能会比@Fildor 改变很多。有那么贵吗?查看编辑和链接,如果确实需要这个想法,这应该是可以接受的。
    • 没有那么。我只是想指出这一点。因此,如果此验证非常经常进行,则找到不需要它的解决方案可能会更有效。但我同意,当它成为问题时,必须考虑到这一点。
    • @Fildor 感谢您指出这一点。很高兴知道。我同意这不是最好的解决方案,但不得不说;)
    【解决方案3】:

    可选是 Java 8 中的好方法。

    String value = foo.getBar().getBaz().toString();
    

    如果是可选的,它将是:

    String value = Optional.ofNullable(foo)
                           .map(Foo::getBar)
                           .map(Bar::getBaz)
                           .map(Baz::toString)
                           .orElse("EmptyString");
    

    【讨论】:

    • 有谁知道这与 if/else 相比的速度如何?
    猜你喜欢
    • 2020-02-03
    • 2018-02-24
    • 2014-08-22
    • 2017-08-06
    • 1970-01-01
    • 2016-11-28
    • 2018-09-29
    • 1970-01-01
    • 2021-07-17
    相关资源
    最近更新 更多