2012-01-30 19 views
262

Estaba pensando si existe una forma mejor/más agradable de negar una instancia de en Java. En realidad, hacer algo como:La mejor manera de "negar" una instancia de

if(!(str instanceof String)) { /* do Something */ } 

embargo, creo que debería existir una "hermosa" sintaxis para hacer esto.

¿Alguien sabe si existe y cómo se ve la sintaxis?


EDIT: Por hermosa, podría decir algo como esto:

if(str !instanceof String) { /* do Something */ } // compile failure 
+16

odio el las reglas de precedencia para 'instanceof' tanto ... – luiscubal

+4

Siempre puedes crear una variable, algo como 'boolean strIsString = str instanceof String;' ... – vaughandroid

+0

sí, @Baqueta, es una opción. Pero, ¿qué diferencias podrían ocurrir en el uso de la memoria en una sintaxis u otra? – caarlos0

Respuesta

207

No, no hay mejor manera; el tuyo es canónico

+0

sí, parece. Gracias. – caarlos0

42

se puede utilizar el método de Class.isInstance:

if(!String.class.isInstance(str)) { /* do Something */ } 

... pero sigue siendo negado y bastante feo.

+4

es un poco mejor, el exceso de paréntesis hace que el código sea feo, en mi humilde opinión. – caarlos0

+0

¿No es esto mucho más lento? – maxammann

+4

Esto tiene un comportamiento diferente. La palabra clave instanceof incluye subclases, el método no, necesita usar Class.isAssignableFrom para replicar el comportamiento. –

15

Por lo general, no solo desea un if sino también una cláusula else.

if(!(str instanceof String)) { /* do Something */ } 
else { /* do something else */ } 

se puede escribir como

if(str instanceof String) { /* do Something else */ } 
else { /* do something */ } 

o puede escribir el código de modo que no es necesario saber si hay una cadena o no. p.ej.

if(!(str instanceof String)) { str = str.toString(); } 

se puede escribir como

str = str.toString(); 
84

No sé lo que usted se imagina cuando se dice "bello", pero ¿qué pasa con esto? Yo personalmente creo que es peor que la forma clásica informados, pero alguien puede gustar ...

if (str instanceof String == false) { /* ... */ } 
+0

sigue siendo feo, voy a editar la pregunta .. por favor espere un segundo .. – caarlos0

+16

+1 para alternativa viable – hidralisk

+11

La doble lógica me duele la cabeza :) – rogerdpack

12

Si puede utilizar las importaciones estáticas, y su código moral les permite

public class ObjectUtils { 
    private final Object obj; 
    private ObjectUtils(Object obj) { 
     this.obj = obj; 
    } 

    public static ObjectUtils thisObj(Object obj){ 
     return new ObjectUtils(obj); 
    } 

    public boolean isNotA(Class<?> clazz){ 
     return !clazz.isInstance(obj); 
    } 
} 

Y luego. ..

import static notinstanceof.ObjectUtils.*; 

public class Main { 

    public static void main(String[] args) { 
     String a = ""; 
     if (thisObj(a).isNotA(String.class)) { 
      System.out.println("It is not a String"); 
     } 
     if (thisObj(a).isNotA(Integer.class)) { 
      System.out.println("It is not an Integer"); 
     } 
    }  
} 

esto es sólo un ejercicio de interfaz fluida, yo nunca uso que en el código de la vida real!
¡Ve por tu forma clásica, no confundirá a nadie que lea tu código!

+0

No me gustan las importaciones estáticas .. de todos modos, gracias por intentar ayudar :) – caarlos0

+5

+1 por el código desviado – hidralisk

2

ok sólo mis dos centavos, utilice un método de cadena es:

public static boolean isString(Object thing) { 
    return thing instanceof String; 
} 

public void someMethod(Object thing){ 
    if (!isString(thing)) { 
     return null; 
    } 
    log.debug("my thing is valid"); 
} 
-1

O simplemente si-else ...

if (str instanceof String) { 
} else { 
    // Your code, please. 
} 
+1

Él quiere negar '(str instanceof Cadena) '. De esta manera va en contra de las leyes de la programación. –

-1

¿Qué pasa con

if (!(x instanceof y)) { 
} 
Cuestiones relacionadas