for - object java example
La mejor manera de "negar" una instancia de (7)
No sé lo que imaginas cuando dices "hermoso", pero ¿qué pasa con esto? Personalmente creo que es peor que la forma clásica que publicaste, pero a alguien le puede gustar ...
if (str instanceof String == false) { /* ... */ }
Estaba pensando si existe una forma mejor / mejor de negar una instanceof
de Java. En realidad, estoy haciendo algo como:
if(!(str instanceof String)) { /* do Something */ }
Pero creo que debería existir una sintaxis "hermosa" 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 */ } // compilation fails
No, no hay mejor manera; el tuyo es canonico
Podrías usar el método Class.isInstance
:
if(!String.class.isInstance(str)) { /* do Something */ }
... pero sigue siendo negado y bastante feo.
Por lo general, usted no quiere solo una cláusula if
sino también 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 para que no necesite saber si es una cadena o no. p.ej
if(!(str instanceof String)) { str = str.toString(); }
Se puede escribir como
str = str.toString();
Si lo encuentra más comprensible, puede hacer algo como esto con Java 8:
Predicate<Object> isInstanceOfTheClass =
objectToTest -> objectToTest instanceof TheClass;
Predicate<Object> isNotInstanceOfTheClass =
isInstanceOfTheClass.negate(); // or objectToTest -> !(objectToTest instanceof TheClass)
if (notInstanceOfTheClass.test(myObject)) {
// do something
}
Si puedes usar importaciones estáticas, y tu código moral lo 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 entonces...
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");
}
}
}
Este es solo un ejercicio de interfaz fluida, ¡nunca lo usaría en el código de la vida real!
¡Sigue tu estilo clásico, no confundirá a nadie más leyendo tu código!
ok solo mis dos centavos, use un método de cadena:
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");
}