【问题标题】:if (a != null && a instanceof A) ... or if (a instanceof A)if (a != null && a instanceof A) ... 或 if (a instanceof A)
【发布时间】:2011-03-20 16:18:32
【问题描述】:

对于以下条件:

if (a != null && a instanceof A)

if (a instanceof A)

首先检查null 是否有任何优势(例如,性能方面)?两个条件的结果应该相等。

【问题讨论】:

    标签: java


    【解决方案1】:

    没有任何优势,你可以用

    if(a instanceof A) {}
    

    如果 a 是 null,这将 return 评估为 false

    【讨论】:

    • +1 JLS:在运行时,如果 RelationalExpression 的值不为 null 并且可以将引用强制转换(第 15.16 节)到 ReferenceType 而不会引发 ClassCastException,则 instanceof 运算符的结果为真.否则结果为假。 java.sun.com/docs/books/jls/third_edition/html/…
    • 自 97 年以来我一直在编程 Java,这对我来说是个新闻。谢谢,+1!
    【解决方案2】:

    JVM 必须自己检查 null。做两次没有多大意义。

    【讨论】:

      【解决方案3】:

      if(a instanceof A) 就够了。

      如果a 为空,则expr 将抛出NullPointerException 时使用if(a!=null && expr) 模式。 a instanceof A 不会抛出 NPE,如果 a 为 null,则仅返回 false

      【讨论】:

        【解决方案4】:

        我严重怀疑首先检查 null 是否有任何好处。这取决于虚拟机如何实现 instancof 检查...有可能它会将 if 本身作为代码的第一部分。

        【讨论】:

        • 这不取决于虚拟机。它的语言规范,“空类型”有一个值:空引用。空引用属于“空类型”类型,因此上述检查对于任何其他类型都返回 false
        • VM 必须实现代码 - 并且它可能做的第一件事是检查 null - 所以通过检查没有性能提升。指定了 RESULT。它是如何达到结果的不是。
        • @TofuBeer 行为是指定的。必须检查是否为空。无论如何它都不取决于实现。
        • 是的,它必须检查它是否为空。但它不一定是它做的第一件事......
        【解决方案5】:

        instanceOf 运算符不需要显式检查空值,因为如果操作数为空,它不会抛出空指针异常。

        在运行时,如果关系表达式的值不为 null,并且可以将引用转换为引用类型而不会引发类转换异常,则 instanceOf 运算符的结果为真。

        如果操作数为 null,则 instanceOf 运算符返回 false,因此不需要显式检查 null。

        考虑下面的例子,

          public static void main(String[] args) {
                     if(a != null && a instanceof ArrayList){                     //Violation
                                System.out.println("In if block");
                     }
                     else
                        {
                             System.out.println("In else block");
                        }
                    }
        

        instanceOf的正确用法如下图,

         public static void main(String[] args) {
                  
                     if(a instanceof ArrayList){                     //Correct way
                              System.out.println("In if block");
                     }
                        else
                      {
                             System.out.println("In else block");
                     }
                 }
        

        【讨论】:

        • 恕我直言:在您的示例中绝对没有理由使用 instanceof ,因为您使用它的所有操作都是 System.out::println 。由于 instanceof 也验证类型,因此仅当您出于某种原因需要该类型验证时才将其用于 null 检查,例如强制从方法返回类型。
        猜你喜欢
        • 2018-01-29
        • 2022-10-23
        • 2022-12-27
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-21
        相关资源
        最近更新 更多