2011-08-22 9 views
5

Generator źródeł Eclipse toString jest niezwykle pomocny, z wyjątkiem sytuacji, gdy obiekty zawierają obiekt kalendarza. Czy istnieje sposób na zmianę generatora Eclipse toString, aby bardziej czytelnie wyświetlać obiekty kalendarza? Możliwe użycie zwykłego SimpleDateFormat? Lub godna zaufania wtyczka?W jaki sposób można zmienić generator kodu Eclipse toString, aby wyświetlać mniej szczegółowe obiekty kalendarza?

Pożądany Kalendarz toString ("yyyy-MM-dd HH: mm: ss"):

2011-08-22 13:29:26 

Próbka Eclipse Kalendarz toString (to dość śmieszne):

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 doprowadziło mnie do rozwiązania. Oto szybka i brudna implementacja niestandardowego toString:

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; 
    } 

} 

Dzięki!

+0

Powiedz światu decydować o standardzie czasowym że większy sens – James

+0

#WORLD: Zdecyduj się na normy czasu sprawia, że ​​więcej sensu ! – HeavyE

Odpowiedz

2

Eclipse używa tylko metody GregorianCalendar.toString(). Jedynym sposobem na zmianę tego byłoby rozszerzenie klasy GregorianCalendar na własny obiekt i zaimplementowanie niestandardowej metody 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

Dzięki za wejście - wolałbym nie zmieniać podstawowego modelu danych, aby mógł działać toString. Powoduje to również pewne dodatkowe komplikacje z javax.persistence. – HeavyE

+0

Zgodziłem się, że to brzydkie, ale to jest sposób naokoło, jeśli jest to dla ciebie ważne. –

0

Celem toString() jest podanie reprezentacji łańcuchowej stanu obiektów. To jest świetne do debugowania i rejestrowania.

Z wyjątkiem najprostszych przypadków, w których format obiektu jest dobrze zdefiniowany, nie należy go używać jako etykiety typu interfejsu użytkownika. Nie ma kontraktu dla toString(), który zapewni spójne wyniki lub format. Jeśli chcesz uzyskać określony typ danych wyjściowych z obiektu do celów wyświetlania użytkownika, zakoduj metodę specjalnie do tego celu. Nie używaj do ToString() dla niego.

W szczególnym przypadku PO istnieje kilkanaście różnych sposobów przedstawienia daty. Dlatego istnieją klasy formatowania daty, aby prezentować spójne dane wyjściowe.

+0

Zdecydowanie nie chcę używaćString do użytku klienta, ale chcę go do rejestrowania i debugowania - i Calendar.toString jest zbyt gadatliwy w tym celu (i jako taki narusza definicję ToString firmy Oracle: "Wynik powinien być zwięzły, ale czytelna reprezentacja, która jest łatwa do przeczytania przez osobę. "). Szukam narzędzia (w Eclipse lub jako wtyczki) do tworzenia metod toString z "zwięzły, ale informacyjny" wynik klasy kalendarza. – HeavyE

5

Poniższe przykłady skutecznie nadpisują metodę toString() dla dowolnej klasy, jak widać tylko z Eclipse Debugger, ale znalazłem ją bardzo użyteczną przy dekodowaniu obiektów kalendarza podczas debugowania.

Dodaj formater Debug szczegół, stosując następujące kroki:

  1. Z menu wybierz Windows-> Preferencje
  2. w preferencjach otwarty Java-> Debug i kliknij formatujących Detail
  3. Tu można dodać żądanego formater

Jako przykład dla obiektu kalendarzowym:

  1. Kliknij Add ..
  2. Wprowadź java.util.Calendar w polu Nazwa typu kwalifikowana
  3. Wprowadź następujące:

    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat ("EEE , d MMM rrrr HH: mm: ss Z "); sdf.format (this.uzyskać czas());

  4. Upewnić Włącz ten szczegół formater jest sprawdzana

  5. kliknij OK.

(Źródło: http://acoderslife.wordpress.com/2009/06/12/eclipse-java-debugging-showing-variable-type-values-calendar/)

+0

Myślałem, że to pytanie dotyczy toString; czy to również zmienia sposób działania generatora toString? –

+0

Dobra uwaga. Zmienia to tylko sposób działania toString w debugerze Eclipse. – gdw2

+0

Jest to niezwykle pomocne! Debagowanie Kalendarzy jest zawsze problemem. – HeavyE

Powiązane problemy