2010-07-25 21 views

Respuesta

18

ninguna ventaja en absoluto, sólo puede hacer con

if(a instanceof A) {} 

esto retorno resultado false si a es null

+5

+1 JLS: En tiempo de ejecución, el resultado del operador instanceof es cierto si el el valor de RelationalExpression no es nulo y la referencia se puede convertir (§15.16) al ReferenceType sin generar una ClassCastException. De lo contrario, el resultado es falso. http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#80289 – barrowc

+0

pin @barrowc apuntado al punto! – naikus

+0

He estado programando Java desde el '97 y esto era nuevo para mí. Gracias, +1! –

0

tengo serias dudas de que de que hay algún beneficio para la comprobación de nula primera . Depende de cómo la VM implemente la instancia de verificación ... lo más probable es que lo haga como la primera parte del código.

+1

No depende de las máquinas virtuales. Es la especificación lang, el "tipo nulo" tiene un valor: la referencia nula. La referencia nula es del tipo "tipo nulo" y, por lo tanto, la comprobación anterior devuelve falso para cualquier otro tipo – naikus

+0

aunque la VM tenga que implementar el código, y lo primero que hace es verificar nulo, por lo que no hay ganancia de rendimiento por poniendo el cheque. Se especifica RESULTADO. Cómo se logra el resultado no es. – TofuBeer

+0

@TofuBeer El comportamiento * está especificado. * Es * debe * comprobar nulo. No depende de una implementación de ninguna manera. – EJP

2

if(a instanceof A) es suficiente.

El patrón if(a!=null && expr) se usa cuando expr arrojará un NullPointerException si a es nulo. a instanceof A no arroja un NPE y simplemente devuelve false si a es nulo.

4

La JVM tiene que comprobar el valor nulo. No tiene mucho sentido hacerlo dos veces.

0

El operador instanceOf no necesita comprobaciones nulas explícitas, ya que no lanza una excepción de puntero nulo si el operando es nulo.

En tiempo de ejecución, el resultado del operador instanceOf es verdadero si el valor de la expresión relacional no es nulo y la referencia se puede convertir al tipo de referencia sin generar una excepción de clase.

Si el operando es nulo, el operador instanceOf devuelve falso y, por lo tanto, no se requieren comprobaciones nulas explícitas.

Considérese el siguiente ejemplo,

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"); 
             } 
         } 

El uso correcto de instanceOf es como se muestra a continuación,

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"); 
             } 
         }