Validando propiedades nulas de un objeto en Java

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?

  1. Primero capturo los metodos que tiene el objeto
  2. Luego si es un metodo get procedo a utilizar su equivalente is o set
  3. 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.

 

Una respuesta a “Validando propiedades nulas de un objeto en Java”

  1. Google Chrome 45.0.2454.101 Google Chrome 45.0.2454.101 Mac OS X  10.11.0 Mac OS X 10.11.0
    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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *