【发布时间】:2011-03-20 16:18:32
【问题描述】:
对于以下条件:
if (a != null && a instanceof A)
或
if (a instanceof A)
首先检查null 是否有任何优势(例如,性能方面)?两个条件的结果应该相等。
【问题讨论】:
标签: java
对于以下条件:
if (a != null && a instanceof A)
或
if (a instanceof A)
首先检查null 是否有任何优势(例如,性能方面)?两个条件的结果应该相等。
【问题讨论】:
标签: java
没有任何优势,你可以用
if(a instanceof A) {}
如果 a 是 null,这将 return 评估为 false
【讨论】:
JVM 必须自己检查 null。做两次没有多大意义。
【讨论】:
if(a instanceof A) 就够了。
如果a 为空,则expr 将抛出NullPointerException 时使用if(a!=null && expr) 模式。 a instanceof A 不会抛出 NPE,如果 a 为 null,则仅返回 false。
【讨论】:
我严重怀疑首先检查 null 是否有任何好处。这取决于虚拟机如何实现 instancof 检查...有可能它会将 if 本身作为代码的第一部分。
【讨论】:
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");
}
}
【讨论】:
System.out::println 。由于 instanceof 也验证类型,因此仅当您出于某种原因需要该类型验证时才将其用于 null 检查,例如强制从方法返回类型。