2011-01-21 6 views
15

Spójrzmy prawdzie w twarz, pisząc ładnie ToString wiadomości to nudne i niechlujne zadanie, które musi być zrobione, ponieważ może być pomocne dla braku zaufania w debuggerze lub logowaniu.Jaka jest najładniejsza klasa budowniczych toString, której użyłeś lub widziałeś? Co sprawiło, że było to miłe?

Jakie cechy lubisz lub życzeniem powinny być w takim pomocnikiem ...

  • właściwości antydumpingowe powinny przyjść w/etykiet.

    name = mP kraj = Australia ...

  • wartości, które są trochę za zwłokę powinny być opcjonalnie pominięta.

    • Nie ma żadnego punktu drukowania wielu właściwości, które mają 0 lub zero.
    • Jeśli ustawisz etykietę, a jej wartość jest pusta, nie dołączaj ani.
  • Separator między etykietą a wartością powinien być aktualizowalny i powinien być automatycznie wstawiany między etykietami i wartościami, gdy są one dodawane.

  • powinien również automatycznie wstawić separator do wyboru.

    Jeśli chcesz mieć przecinki, niezależnie od wartości, gdy dodajesz tablicę, niech tak będzie.

  • powinien automatycznie cytować wartości ciągów ... ponieważ ważne jest, aby dokładnie wiedzieć, gdzie zaczyna się i kończy ciąg.

    * name = mP state = „Nowa Południowa Walia”

  • gdy lista, lub zestaw map dodano przepisy o cytowaniu ciągów za pomocą ustawionego separatora etc powinny być przestrzegane. Proszę nie po prostu zrzucić Collection.toString().

mam kilka innych w someting robię postępy można wymienić swoje własne pomysły, spostrzeżenia itp

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(); 

wola oczywiście skutkować „name =” „numerów Australia = 1, 2 , 3;

Odpowiedz

9

właśnie używać IDE do wygenerowania toString dla mnie Gdybym zmienić kod, usunąć metodę i zregenerować

+1

Yeh ale generowane toStrings ssać, mają wszystkie niedociągnięcia opisane w q. –

+0

Nawiązywałam do tego, że to po prostu nie jest tak ważne. 'toString()' jest po prostu mechanizmem debugowania umożliwiającym oglądanie stanu klasy. Prezentację danych należy wykonać za pomocą jakiegoś eksternalizowanego formatyzatora. Jeśli używasz 'toString()' do czegokolwiek innego, to myślę, że masz błędny projekt. –

+3

Możesz zrobić coś lepszego niż wygenerowane doStrings, więc dlaczego nie pójść dalej i napisać prawidłowy ciąg doString, który jest znaczący, zamiast wyrzucać każde pole możliwe. Jest tyle słabości w tym podejściu, że nie jest zabawne. Wyobraźmy sobie, że gdyby String.toString zastosował takie podejście, mielibyśmy trochę brzydkiego char [] zrzucenie tablicy z pojedynczym zrzutem znaków. –

20

Apache ToStringBuilder ma przyzwoitą implenentation z b.. wół:

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

Właśnie patrzę teraz, jak sprawić, by jego wydruki były nieco ładniejsze. ReflectionStringBuilder wydaje się oferować więcej personalizacji. Konkretnie Lubię to:

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

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

Wyjście wygląda następująco:

[[email protected], age=16, createdDate=<null>, favoriteColor=blue, id=2] 
Powiązane problemy