2011-08-22 6 views
5

El generador de origen Eclipse toString es extremadamente útil, excepto cuando los objetos contienen un objeto de calendario. ¿Hay alguna manera de cambiar el generador de Eclipse toString para mostrar los objetos de Calendar de forma más limpia? Posiblemente usando un SimpleDateFormat común? ¿O un complemento confiable?¿Cómo se puede cambiar el generador de código de Eclipse toString para mostrar menos objetos Calendarios menos detallados?

deseado toString Calendario ("aaaa-MM-dd hh: mm: ss"):

2011-08-22 13:29:26 

Muestra Eclipse Calendario toString (esto es bastante ridículo):

java.util.GregorianCalendar[time=1314034166984,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2011,MONTH=7,WEEK_OF_YEAR=35,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=234,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=1,HOUR_OF_DAY=13,MINUTE=29,SECOND=26,MILLISECOND=984,ZONE_OFFSET=-18000000,DST_OFFSET=3600000] 

FuryComputers me llevó a una solución. Aquí está una implementación personalizada de ToString rápida y sucia:

import java.text.SimpleDateFormat; 
import java.util.Calendar; 

public class MyToStringBuilder { 
    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; 
    private String str; 
    private boolean isFirst; 

    public MyToStringBuilder(Object o) { 
     isFirst = true; 
     str = ""; 
     str += o.getClass().getSimpleName() + " ["; 
    } 

    public MyToStringBuilder appendItem(String variableName, Object value) { 
     if(value != null){ 
      this.addItem(variableName, value.toString()); 
     } else { 
      this.addItem(variableName, "null"); 
     } 
     return this; 
    } 

    public MyToStringBuilder appendItem(String variableName, Calendar value) { 
     if(value != null){ 
      SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); 
      this.addItem(variableName, sdf.format(value.getTime())); 
     } else { 
      this.addItem(variableName, "null"); 
     } 
     return this; 
    } 

    private void addItem(String variableName, String value) { 
     if(!isFirst){ 
      str += ", "; 
     } 
     isFirst = false; 
     str += variableName + "="; 
     str += value; 
    } 

    @Override 
    public String toString() { 
     str += "]"; 
     return str; 
    } 

} 

¡Gracias!

+0

Informe a todo el mundo para decidir sobre un estándar de tiempo que tiene más sentido – James

+0

# world: Decidir sobre un estándar de tiempo que tiene más sentido ! – HeavyE

Respuesta

2

Eclipse solo utiliza el método GregorianCalendar.toString(). La única forma de cambiar esto sería ampliar la clase GregorianCalendar en su propio objeto e implementar un método personalizado toString().

import java.text.SimpleDateFormat; 
import java.util.GregorianCalendar; 

public class MyGregorianCalendar extends GregorianCalendar 
{ 
    public MyGregorianCalendar() { 
     super(); 
    } 

    SimpleDateFormat sdf = new SimpleDateFormat("H:MM:d kk:m:s"); 
    public String toString() { 
     return sdf.format(getTime()); 
    } 
} 
+0

Gracias por la entrada. Prefiero no cambiar el modelo de datos subyacente para que un toString pueda funcionar. Esto también causaría algunas complicaciones adicionales con javax.persistence. – HeavyE

+0

Estoy de acuerdo en que es feo, pero esa es la forma de evitarlo si es importante para ti. –

0

El propósito de toString() es dar una representación de cadena del estado de los objetos. Esto es ideal para la depuración y el registro.

Excepto en los casos más simples en los que el formato de un objeto está bien definido, no debe utilizarse como una etiqueta de tipo UI. No existe un contrato para toString() que garantice resultados o formatos consistentes. Si desea un tipo específico de salida de un objeto para fines de visualización del usuario, codifique un método específico para eso. No use toString() para eso.

En el caso específico del OP, hay una docena de maneras diferentes de representar una fecha. Es por eso que hay clases de formato de fecha para presentar resultados consistentes.

+0

Definitivamente no quiero String para el uso del cliente pero lo quiero para el registro y la depuración, y el Calendar.toString es excesivamente detallado para ese propósito (y como tal viola la definición de Oracle de toString: "El resultado debe ser conciso pero representación informativa que es fácil de leer para una persona "). Estoy buscando una herramienta (en Eclipse o como complemento) para crear métodos toString con un resultado de clase de calendario 'conciso pero informativo'. – HeavyE

5

Lo siguiente sobrescribe eficazmente el método toString() para cualquier clase como se ve usando el Depurador Eclipse solamente, pero me pareció muy útil para decodificar objetos de calendario mientras depuro.

Añadir un formateador de depuración detalle, siguiendo estos pasos:

  1. desde el menú seleccionar Windows-> Preferencias
  2. En Preferencias abierta Java-> Depurar y haga clic en Formateadores Detalle
  3. Aquí puede añadir su formateador deseada

Como ejemplo, para el objeto de calendario:

  1. Haga clic en Agregar ..
  2. Introduzca java.util.Calendar en el campo de nombre de tipo calificado
  3. Introduzca lo siguiente:

    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat ("EEE , d MMM aaaa HH: mm: ss Z "); sdf.format (esto.consigue tiempo());

  4. Asegúrese de que Habilitar este detalle se comprueba formateador

  5. Haga clic en OK.

(Fuente: http://acoderslife.wordpress.com/2009/06/12/eclipse-java-debugging-showing-variable-type-values-calendar/)

+0

Pensé que la pregunta era sobre String; ¿Esto también cambia la forma en que funciona el generador toString? –

+0

Buen punto. Esto solo cambia cómo toString funciona con el depurador de Eclipse. – gdw2

+0

¡Esto es increíblemente útil! La depuración de calendarios siempre es un problema. – HeavyE

Cuestiones relacionadas