2011-01-21 20 views
15

Hagámosle frente escribir bien a mensajes de cadena es una tarea aburrida y desordenada que debe hacerse ya que puede ser realmente útil para la insección en un depurador o registro.¿Cuál es la clase de constructor de toString más agradable que has usado o visto? Lo que lo hizo agradable

¿Qué características te gusta o deseo debe estar en un ayudante tales ...

  • propiedades de dumping deben venir w/etiquetas.

    name = mP país = Australia ...

  • valores que son algunos opcionalmente por defecto debe ser omitido.

    • No hay puntos para imprimir muchas propiedades que son 0 o nulas.
    • Si establece una etiqueta y el valor es nulo, tampoco incluya ninguno.
  • el separador entre etiqueta y valor debe ser actualizable y debe insertarse automáticamente entre las etiquetas y los valores cuando se agregan.

  • también debe insertar automáticamente el separador de su elección.

    Si desea espacios de coma entre valores al incluir una matriz, que así sea.

  • debe indicar automáticamente valores de cadena ... porque es importante saber exactamente dónde comienza y termina una cadena.

    * name = mP estado = "Nueva Gales del Sur"

  • cuando se añade una lista, mapa o establecer las reglas acerca citando cadenas, utilizando el conjunto separador etc deben ser respetados. Por favor, no solo descargues Collection.toString().

tengo algunos otros en calle detrás estoy mejorando puede enumerar que sus propias ideas, observaciones, etc.

new ToStringBuilder() 
    .setLabelValueSeparator('=') 
    .label("name") 
    .value(Country.AUSTRALIA) // -> returns "Australia" without the quotes. 
    .label("day of death") 
    .value(null) // 
    .label("numbers") 
    .valueSeparator(","); 
    .value(Arrays.asList(1, 2, 3) 
    .build(); 

voluntad del resultado curso de "= nombre de" números de Australia"= 1, 2 , 3;

Respuesta

9

acabo de usar mi IDE para generar el toString para mí Si cambio el código, elimino el método y regenerar

+1

Yeh pero generadas toStrings chupan, que tienen todas las debilidades descritas en el q. –

+0

Estaba aludiendo al hecho de que simplemente no es tan importante. 'toString()' es simplemente un mecanismo de depuración para permitir la visualización del estado de una clase. La presentación de los datos debe hacerse mediante algún tipo de formateador externo. Si está utilizando 'toString()' para cualquier otra cosa, entonces creo que tiene mal el diseño. –

+3

Puede hacerlo mejor que generado a cadenas, así que ¿por qué no ir un poco más lejos y escribir un toString que sea significativo en lugar de descargar todos los campos posibles? Hay tantas debilidades con este enfoque que no es gracioso. Imagínese si String.toString adoptara este enfoque, tendríamos algún feo char [] volcado de una matriz con volcado de caracteres individuales. –

20

Apache ToStringBuilder tiene un implenentation decente fuera de la b.. ox:

@Override 
public String toString() { 
    return ToStringBuilder.reflectionToString(this); 
} 

En este momento estoy buscando cómo hacer que su salida sea un poco más bonita. ReflectionStringBuilder parece ofrecer algo más de personalización. Específicamente me gusta esto:

@Override 
public String toString() { 
    StandardToStringStyle style = new StandardToStringStyle(); 
    style.setFieldSeparator(", "); 
    style.setUseClassName(false); 
    style.setUseIdentityHashCode(false); 

    return new ReflectionToStringBuilder(this, style).toString(); 
} 

La salida tiene el siguiente aspecto:

[[email protected], age=16, createdDate=<null>, favoriteColor=blue, id=2] 
Cuestiones relacionadas