Todo programador java sabe que los tipos primitivos tienen un valor por defecto y los objetos por defecto tienen valor nulo (si no lo sabias ponte a estudiar).
A veces es necesario validar estos objetos para realizar operaciones sobre ellos y asegurarnos que nuestro usuario no reciba un magico nullPointerException. El metodo más rapido seria validar una a una las propiedades o la opción que me gusta, preguntarle a nuestro objeto que propiedades tiene y luego utilizar los metodos propios del objeto con Java Reflection.
Java Reflection es un API poco conocida por programadores principiantes, sin embargo es la unica salida en programas que requieren la habilidad de examinar un objeto en tiempo de ejecución. Si no han leido acerca de esto no se preocupen el Java Tutorial lo califica como avanzado.
Todos los detalles acerca de reflection se encuentra en el Java Tutorial sin embargo la clase que utilizo para validar nulos es la siguiente:
public class NullValidator { public static Object validarCampos(Object pObjeto) { Object objeto = pObjeto; Method metodos[] = pObjeto.getClass().getMethods(); for (int i = 0; i < metodos.length; i++) { Method metodo = metodos[i]; //Si es un metodo get o is lo utilizo con su equivalente set if ((metodo.getName().substring(0, 3).equalsIgnoreCase("get") || metodo.getName().substring(0, 2).equalsIgnoreCase("is")) && !metodo.getName().equals("getClass")) { String methodNameSet = ""; if(metodo.getName().substring(0, 3).equalsIgnoreCase("get")){ methodNameSet = metodo.getName().replaceFirst("get", "set"); }else{ methodNameSet = methodNameSet.replaceFirst("is", "set"); } try { Method metodoSet = pObjeto.getClass().getMethod(methodNameSet, metodo.getReturnType()); if (metodoSet != null) { //Datos numericos //Si es byte if (metodo.getReturnType().equals(java.lang.Byte.class)) { Byte valor = (Byte)metodo.invoke(pObjeto, new Object[0]); if(valor==null){ metodoSet.invoke(pObjeto, 0); } } //Si es bigDecimal if (metodo.getReturnType().equals(java.math.BigDecimal.class)) { BigDecimal valor = (BigDecimal)metodo.invoke(pObjeto, new Object[0]); if(valor==null){ metodoSet.invoke(pObjeto, new BigDecimal(0)); } } // Si es Double if (metodo.getReturnType().equals(java.lang.Double.class)) { Double valor = (Double)metodo.invoke(pObjeto, new Object[0]); if(valor==null){ metodoSet.invoke(pObjeto, new Double(0)); } } //Si es un string if (metodo.getReturnType().equals(java.lang.String.class)) { String valor = (String)metodo.invoke(pObjeto, new Object[0]); if(valor==null){ metodoSet.invoke(pObjeto, ""); } } //Si es una lista if (metodo.getReturnType().equals(java.util.List.class)) { List objetosList = (List)metodo.invoke(pObjeto, new Object[0]); for(Object objetoFromList:objetosList){ NullValidator.validarCampos(objetoFromList); } } //Si es date if (metodo.getReturnType().equals(java.util.Date.class)) { Date valor = (Date)metodo.invoke(pObjeto, new Object[0]); if(valor==null){ metodoSet.invoke(pObjeto, new Date()); } } //Si es primitivo if (metodo.getReturnType().isPrimitive()) { //los primitivos no permiten null } } } catch (Exception e) { } } } return objeto; } } |
¿Como funciona?
- Primero capturo los metodos que tiene el objeto
- Luego si es un metodo get procedo a utilizar su equivalente is o set
- Por ultimo compruebo el tipo de dato y si es nulo, si es nulo procedo a darle un valor inicial
Luego basta con invocar el metodo validarCampos (porque además es estatico) y listo nuestro objeto sera validado contra valores nulos.
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Excelente aporte, Funciona muy bien. Muchas gracias