2011-01-21 7 views
15

Lascia che sia bello scrivere messaggi toString è un compito noioso e noioso che deve essere fatto in quanto può essere davvero utile per l'inseption in un debugger o nel logging.Qual è la più bella classe di build toString che hai usato o visto? Che cosa lo ha reso piacevole

Quali caratteristiche ti piace o desiderio dovrebbe essere in un tale aiuto ...

  • proprietà di dumping dovrebbero venire w/etichette.

    name = mP paese = Australia ...

  • valori che sono un po 'di default dovrebbe essere opzionalmente saltato.

    • Non è possibile stampare molte proprietà 0 o null.
    • Se si imposta un'etichetta e il valore è null, non includere.
  • il separatore tra etichetta e valore deve essere aggiornabile e deve essere inserito automaticamente tra etichette e valori quando vengono aggiunti.

  • dovrebbe anche inserire automaticamente il separatore di vostra scelta.

    Se si desidera uno spazio per le virgole, qualunque sia il valore tra un array e l'altro, è necessario.

  • dovrebbe quotare automaticamente valori stringa ... perché è importante sapere esattamente dove inizia e termina una stringa.

    * name = mP state = "New South Wales"

  • quando viene aggiunto un elenco, mappa o impostare le regole circa citando stringhe, utilizzando il set di separazione, ecc dovrebbe essere rispettato. Non scaricare semplicemente Collection.toString().

Ho un paio di altri in someting sto migliorando si può elencare le proprie idee, osservazioni ecc

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

volontà ovviamente comportare "name =" numbers Australia"= 1, 2 , 3;

risposta

9

ho appena usare il mio IDE per generare il toString per me Se cambio il codice, a cancellare il metodo e rigenerare

+1

Yeh ma generate toStrings succhiare, hanno tutte le debolezze descritte nel q. –

+0

Mi stavo alludendo al fatto che non è così importante. 'toString()' è semplicemente un meccanismo di debug per consentire la visualizzazione dello stato di una classe. La presentazione dei dati dovrebbe essere eseguita da una sorta di formattatore esterno. Se stai usando 'toString()' per qualsiasi altra cosa, allora penso che tu abbia sbagliato il tuo progetto. –

+3

È possibile ottenere risultati migliori delle toString generate, quindi perché non andare oltre e scrivere un toString corretto che è significativo anziché eseguire il dumping di ogni campo possibile. Ci sono così tante debolezze che questo approccio non è divertente. Immaginate se String.toString abbia preso questo approccio avremmo qualche brutto char [] dump di un array con dump di singoli caratteri. –

20

Apache ToStringBuilder ha un implenentation decente fuori dal b.. bue:

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

Attualmente sto cercando proprio ora come ottenere un risultato migliore. ReflectionStringBuilder sembra offrire un po 'più di personalizzazione. Nello specifico come questo:

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

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

L'output è simile al seguente:

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