analytics

Mostrando entradas con la etiqueta Java toString cascade. Mostrar todas las entradas
Mostrando entradas con la etiqueta Java toString cascade. Mostrar todas las entradas

jueves, 6 de julio de 2017

Java toString en cascada para debug



Vamos a ver cómo podemos hacer el método toString a lo largo de nuestras clases de manera que nos resulte muy cómodo para debugear, sin tener que esforzarse demasiado y manteniendo el orden, cada clase contendrá su output en String adecuado y sólo el suyo. Al final, tendremos un toString() en cascada que cumplirá con dos objetivos

  1. Facilitará el debug y nos resultará muy cómodo
  2. Nos mantendrá el orden y limpieza de código

Veamos cómo conseguirlo, es muy sencillo.

Tendremos dos clases: Call y Connection. La relación entre ellas es que una Call tiene una lista de Connections.



Veamos primero la clase Connection.



public class Connection {
    
    private String phone;
    private int direction = 0;
    private String substate;

     // ... aquí irían los métodos get/set


    @Override
    public String toString() {
        return "Connection{" + "phone=" + phone + ", direction=" + direction + ", substate=" + substate + '}';
    }

    
}



Hasta aquí nada especial, simplemente, vamos a darnos cuenta de que es esencial que el toString esté representado en su lugar, es decir, la representación String de una Connection, deberá estar dentro de la clase Connection. (por motivos de orden y limpieza). Veamos la clase Call.


public class Call {
    
    private String callID="";
    private int state = 0;
    private int type = 0;
    private ArrayList<Connection> connections = new ArrayList<Connection>();
    
    
    // ... aquí irían los métodos get/set

    @Override
    public String toString() {
        String retVal = "Call{" + "callID=" + callID + ", state=" + state + ", type=" + type+"\n" ;
        for (Iterator<Connection> iterator = connections.iterator(); iterator.hasNext();) {
            Connection next = iterator.next();
            retVal+=next.toString()+"\n";
        }
        retVal+="}";
        return retVal;
    }

    
}


Si prestamos atención al método toString, ya vemos en qué va a consistir la estructura en cascada. Simplemente llamando al método toString de una Call, ya nos imprimirá toda la lista de Connections, dado que la clase Connection también implementará su propio toString, como hemos visto anteriormente.

Es muy sencillo, pero muy potente. Para objetos compuestos con varios niveles de profundidad, debugear puede terminar siendo un infierno. Con éste método, cada clase se genera su propio String de debug y al final, simplemente, llamando al toString de la clase cabeza, tendremos el debug completo de todos sus "hijos". Con poco esfuerzo y sin sacrificar la limpieza.