2012-02-25 8 views
50

Ho utilizzato ToStringBuilder.reflectionToString(class) in common-lang, per implementare toString() per semplici DTO. Ora sto cercando di usare Google Guava invece della libreria di Apache. E ho trovato Objects.ToStringHelper in Guava. Ma è troppo prolisso se ci sono molti membri nella classe. Per esempio:Utilizzo di Google Guava's Objects.ToStringHelper

@Override 
public String toString() { 
    return MoreObjects.toStringHelper(this.getClass()).add("name", name) 
      .add("emailAddress", emailAddress) 
      .add("department", department).add("yearJoined", yearJoined) 
      .toString(); 
} 

è molto più semplice se uso commons-lang:

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

È stato rilevato qualche modi migliori per attuare toString() con Guava, non con commons-lang?

Guava docs

risposta

105

Ho un piccolo trucco per Guava di com.google.common.base.MoreObjects.toStringHelper(). Ho configurato IntelliJ IDEA per utilizzarlo durante la generazione automatica dei metodi toString(). Presumo che tu possa fare lo stesso in Eclipse. Ecco come farlo in Intellij:

  • andare all'interno di una classe
  • colpito Alt + Inserire far apparire il menu "Generate"
  • scegliere toString()
  • clic su "Impostazioni Pulsante "
  • passare alla scheda" Modelli "
  • creare un nuovo modello denominato "di Guava MoreObjects.toStringHelper()" (l'ho fatto copiando il modello "ToStringBuilder")
  • cambiamento del modello per:

    public String toString() { 
    #set ($autoImportPackages = "com.google.common.base.MoreObjects") 
        return MoreObjects.toStringHelper(this) 
    #foreach ($member in $members) 
        .add("$member.name", $member.accessor) 
    #end 
        .toString(); 
    } 
    
  • salvare il modello, chiudere la finestra "Impostazioni" e "Genera toString()" finestre

  • è ora possibile scegliere il modello Guava's MoreObjects.toStringHelper() durante la generazione toString() metodi

quando si aggiunge un nuovo campo alla classe, semplicemente ri- generare il metodo toString() (IDEA chiederà di confermare che si desidera sostituire il metodo esistente toString()).

+14

* Suppongo che tu possa fare lo stesso in Eclipse * No, nessuna possibilità. –

+0

Grazie per questo funziona bene, ma mi manca lo stile multilinea di apache commons: '( –

+0

Molto conveniente! Grazie –

30

MoreObjects.toStringHelper ha lo scopo di aiutarvi a scrivere toString() metodi con un formato coerente con facilità, ma ti permette di controllare quali campi si includere nel toString() e dovrebbe avere prestazioni paragonabili a scriverlo manualmente. reflectionToString è più breve da digitare, ma non ti dà il controllo esplicito sui campi inclusi e, beh, usa la riflessione. Non la vedo come un'alternativa migliore.

Come nota a margine, penso che l'utilizzo di toStringHelper sembra molto più pulito se si inserisce una chiamata add per riga.

Guava docs

+0

grazie, ha aiutato molto! – philipjkim

10

C'è un plug-in http://sourceforge.net/projects/guavaeclipse/ (molto piccolo) che può generare metodi toString (ed equivale a hashcode) utilizzando le classi Guava. Questa è una bella soluzione perché i metodi generati sono veramente piccoli e non ingombrano la classe.

+0

Solo una questione di chiarimenti: questo plugin non è perfetto - i metodi toString non possono essere generati per le classi nidificate, ad esempio, ma comunque, nel 90% dei casi questo è abbastanza buono. –

+0

Hmm ... Posso farlo in qualche modo ... Basta selezionare il nome della classe interna e andare avanti ... –

4

Vale la pena notare che Objects.toStringHelper è stato deprecato (da rimuovere completamente a giugno 2016) in favore di MoreObjects.toStringHelper. Ho copiato il modello Guava predefinito nel mio IDE Intellij in uno nuovo che utilizza invece MoreObjects. Saluti.

Guava docs

+0

Risposta accettata modificata per usare MoreObjects. –

3

Dei plugin Eclipse disponibili, guavaeclipse è ancora utilizzando MoreObjects.toStringHelper, ma Jenerate usa MoreObjects.toStringHelper e funziona come un fascino.

Guava docs

+0

Puoi approfondire un po 'di come questo aiuta? – Cristik

+0

La risposta accettata in alto illustra come generare metodi MoreObjects.toStringHelper toString con IntelliJ, ma ciò non è di alcuna utilità per i molti utenti di Eclipse. Altre risposte menzionano il plugin guavaeclipse, quindi l'ho provato, ma utilizza Object.toStringHelper deprecato. Poi sono incappato in Jenerate e ha funzionato così ho pensato di condividere. – James

+0

Grazie per la spiegazione, potresti aggiungerlo anche alla risposta, dove è più visibile? – Cristik

0

in Eclipse è possibile creare un modello (non potente come IntelliJhttps://stackoverflow.com/a/9445402/1301197). Non in loop in tutti i campi dei membri per voi, ma si ottiene almeno il codice circostante

windows > preferences > Java > Editor > Templates

${:import(com.google.common.base.MoreObjects)} 
@Override 
public String toString() { 
    return MoreObjects.toStringHelper(this) 
    .add("${field}",${field}) 
    .toString(); 
} 

Questo aggiungerà l'importazione e otterrete qualcosa di simile se si immette id come il campo. Poi a te aggiungere i campi rimanenti.

public String toString() 
{ 
    return MoreObjects.toStringHelper(this).add("id", id).toString(); 
} 

Si noti che non v'è probabilmente una soluzione migliore utilizzando generatore toString eclisse() e la creazione di un costruttore toString personalizzato(). Ma questo è troppo lavoro per un uomo pigro come me.

Fare clic con il pulsante destro del mouse quindi source > generate toString() e selezionare Custom toString() Builder nello stile del codice.

Problemi correlati