2015-09-21 10 views
6

voglio sbarazzarsi di questa dipendenza: import com.google.common.base.MoreObjects;Alternativa a MoreObjects in Java 8

C'è un modo semplice e/o elegante per riscrivere la toString() seguente funzione utilizzando Java 8 funzioni native?

@Override 
public String toString() { 
    return MoreObjects 
    .toStringHelper(this) 
    .add("userId", this.userId) 
    .add("timestamp", this.timestamp) 
    .toString(); 
} 

risposta

19

È possibile utilizzare StringJoiner da java.util pacchetto.

Esempio:

@Override 
public String toString() { 
    return new StringJoiner(", ", ClassName.class.getSimpleName() + "[", "]") 
    .add("userId=" + userId) 
    .add("timestamp=" + timestamp) 
    .toString(); 
} 
+0

Sceglierò questa soluzione per la sua chiarezza ed eleganza. Trovo 'StringBuilder' meno auto-esplicativo confrontandolo con' StringJoiner'. Il semplice 'str1 + str2' è troppo basso (e dettagliato) per me. Grazie. – Costin

+2

Attenzione, che 'Class # getSimpleName()' è silenzioso lento. – Konsumierer

3

Perché non costruire lo String da soli? Il codice è semplice da scrivere e da comprendere, senza utilizzare alcuna funzionalità specifica di Java 8.

@Override 
public String toString() { 
    StringBuilder sb = new StringBuilder(); 
    sb.append(getClass().getSimpleName()).append('{') 
    sb.append("userId=").append(userId); 
    sb.append(", timestamp=").append(timestamp); 
    return sb.append('}').toString(); 
} 
+0

Does 'sb.append (" MyMap-String-Integer = "). Append (myMapStrInt)' produce un bel json-like formando la mia mappa? – Costin

+3

@Costin, la maggior parte delle mappe ha correttamente implementato il metodo 'toString()', quindi sì. –

4

non vedo alcun motivo per utilizzare questo toStringHelper anche prima di Java-8. L'implementazione normale non è più lungo:

@Override 
public String toString() { 
    return getClass().getSimpleName()+"[" 
      +"userId: "+this.userId+", " 
      +"timestamp: "+this.timestamp 
      +"]"; 
} 
+0

Questo (EDIT: * may *) genererà più spazzatura rispetto alla soluzione 'StringBuilder'. – sdgfsdh

+5

@sdgfsdh, hai qualche prova? –

+4

@sdgfsdh Penso che il compilatore lo ottimizzerà e il bytecode generato sarà lo stesso che usare StringBuilder (dato che + non è in loop) – Tunaki

1

Basta con una soluzione piuttosto fresco per far IntelliJ Idea generare il toString con StringJoiner: https://gist.github.com/vlastikcz/6a3b5c158bdb7bf6e9fd (grazie mille per l'autore)
aggiungere il codice ai modelli toString: premere Alt + Inserisci, seleziona toString, quindi seleziona Impostazioni oltre a Modelli, aggiungi con il segno Più: enter image description here