parameter - @notnull java
¿Cómo verificar múltiples objetos por nulidad? (5)
En Java 8, puede usar Stream.allMatch
para verificar si todos los valores coinciden con una determinada condición, como ser null
. No mucho más corto, pero tal vez un poco más fácil de leer.
if (Stream.of(a, b, c).allMatch(x -> x == null)) {
...
}
Y de manera análoga para anyMatch
y noneMatch
.
Acerca de su "ejemplo más desafiante": en este caso, creo que no hay forma de evitar la escritura de una conjunción de verificación nula de nulos, como la que tiene:
if (a != null && a.getFoo() != null && a.getFoo().getBar() != null) {
...
}
Cualquiera de los otros enfoques, utilizando secuencias, listas o métodos var-arg, intentaría evaluar a.getFoo()
antes de que se haya probado que no es null
. Podría usar Optional
con punteros de map
y método, que se evaluarán de forma perezosa uno después del otro, pero si esto lo hace más legible es discutible y puede variar de un caso a otro (particularmente para nombres de clase más largos):
if (Optional.ofNullable(a).map(A::getFoo).map(B::getBar).isPresent()) {
...
}
Bar bar = Optional.ofNullable(a).map(A::getFoo).map(B::getBar).orElse(null);
Otra alternativa podría ser try
de acceder al elemento más interno, pero tengo la sensación de que esto tampoco se considera una buena práctica:
try {
Bar bar = a.getFoo().getBar();
...
catch (NullPointerException e) {
...
}
Particularmente, esto también capturará cualquier otro NPE después de acceder a ese elemento - o eso, o solo debe poner la Bar bar = ...
en el try
y todo lo demás en otro if
bloque después del try
anula cualquiera (cuestionable) ganancias en legibilidad o brevedad.
(Recuerdo vagamente algo acerca de una notación como a?.getFoo()?.getBar() != null
, pero no recuerdo si fue una solicitud de función para Java o un lenguaje completamente diferente).
A menudo, puedo ver un código como el siguiente:
if(a == null || b == null || c == null){
//...
}
Me pregunto si hay alguna biblioteca ampliamente utilizada (Google, Apache, etc.) para verificar la nulidad de varios objetos a la vez, por ejemplo:
if(anyIsNull(a, b, c)){
//...
}
o
if(allAreNulls(a, b, c)){
//...
}
ACTUALIZAR:
- Sé perfectamente cómo escribirlo yo mismo
- Sé que puede ser el resultado de la estructura deficiente del programa, pero no es un caso aquí
Hagamos que sea más desafiante y reemplace el ejemplo original con algo como esto:
if(a != null && a.getFoo() != null && a.getFoo().getBar() != null){ //... }
ACTUALIZACIÓN 2:
Creé una solicitud de extracción de la biblioteca Apache Commons Lang para solucionar este problema:
- Problema: https://issues.apache.org/jira/browse/LANG-781
- PR: https://github.com/apache/commons-lang/pull/108
Estos serán incorporados en commons-lang, versión 3.5:
-
anyNotNull (Object... values)
-
allNotNull (Object... values)
Es posible con la ayuda de la clase Objects
public static void requireNonNull(Object... objects) {
for (Object object : objects) {
Objects.requireNonNull(object);
}
}
Puede crear una lista de sus objetos y usar yourList.contains(null)
en ella.
List < Object > obList = new ArrayList < Object > ();
String a = null;
Integer b = 2;
Character c = ''9'';
obList.add(a);
obList.add(b);
obList.add(c);
System.out.println("List is " + obList);
if (obList.contains(null)) {
System.out.println("contains null");
} else {
System.out.println("does not contains null");
}
También podría usar algo como el siguiente método. Le permite pasar tantos parámetros como desee:
public static boolean isAnyObjectNull(Object... objects) {
for (Object o: objects) {
if (o == null) {
return true;
}
}
return false;
}
Lo llamas con tantos parámetros como quieras:
isAnyObjectNull(a, b, c, d, e, f);
Podría hacer algo similar para areAllNull
.
public static boolean areAllObjectsNull(Object... objects) {
for (Object o: objects) {
if (o != null) {
return false;
}
}
return true;
}
Nota : también puede usar el operador ternario en lugar de if (o == null)
. Los dos métodos que se muestran aquí no tienen ningún error de manejo. Ajústelo a sus necesidades.
EDIT 2018: A partir de Apache Commons lang 3.5, ha habido ObjectUtils.allNotNull()
y ObjectUtils.anyNotNull()
.
No.
Ninguno de Apache Commons Lang (3.4) , Google Guava (18) y Spring (4.1.7) proporcionan dicho método de utilidad.
Tendrá que escribirlo solo si realmente lo necesita. Sin embargo, en el código Java moderno, probablemente consideraría la necesidad de tal construcción como un olor a código.