2013-05-13 9 views
24
@Override 
public String toString() { 
    return new Gson().toJson(this); 
} 

sono io rompendo alcune buone pratiche, "Joshua" -pattern cosa, modello di progettazione generale o altra convenzione semplicemente facendo questo come comportamento predefinito per i miei oggetti del modello?OK per utilizzare l'output JSON come predefinito per toString()?

toString() verrà comunque utilizzato solo nel debugging nel paradigma (Android) che stiamo attualmente utilizzando. Questo è anche il motivo per cui mi piace vedere l'oggetto in JSON dal momento che molta persistenza di ORM/json avverrà attraverso http-> php/python-> mysql e SQLite locale.

+3

Non stai rompere nulla. 'toString()' può restituire qualsiasi stringa (ma probabilmente dovrebbe restituire la stessa stringa ogni volta che la si chiama sulla stessa istanza, a meno che lo stato interno dell'istanza non cambi). –

+0

sì, questo è il prerequisito se si crede di essere ... l'unico (?) Per toString(). In requisiti di convenzione che è – tortal

+1

@SotiriosDelimanolis: non se lo stato interno dell'istanza cambia. –

risposta

38

Sì. È OK utilizzare la libreria GSON/Jackson/Reflections per implementare il metodo toString().

Esistono alcuni modi per implementare il metodo toString.

  1. Reflections (biblioteca Apache)

    @Override 
    public String toString(){ 
        return org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(this); 
    } 
    
  2. JSON implementazione basata (GSON, librerie Jackson)

    // GSON library for JSON 
    @Override 
    public String toString(){ 
        return new com.google.gson.Gson().toJson(this); 
    } 
    
    // Jackson libabry for JSON/YAML 
    @Override 
    public String toString() { 
        try { 
         return new com.fasterxml.jackson.databind.ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this); 
        } catch (com.fasterxml.jackson.core.JsonProcessingException e) { 
         e.printStackTrace(); 
        } 
        return null; 
    } 
    
  3. ToStringBuilder (disponibile con biblioteca apache-commons)

    @Override 
    public String toString() { 
        return new org.apache.commons.lang3.builder.ToStringBuilder(this). 
         append("field1", field1). 
         append("field2", field2). 
         toString(); 
    } 
    
  4. hard-core toString() implementazione

    @Override 
    public String toString() { 
        return new StringBuilder() 
         .append("field1:"+field1) 
         .append("field2:"+field2) 
         .toString(); 
    } 
    
+2

Risposta sorprendente, molto dettagliata con diverse opzioni e in poche righe. 1. – maaw

+0

La risposta potrebbe essere migliorata discutendo il contratto di [toString] (https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString()) e se un La serializzazione JSON soddisfa quel contratto (credo che lo faccia) e qualsiasi potenziale svantaggio (prestazioni? Ma mitigato dal contratto - il metodo è per il debug/display, quindi non dovrebbe essere performante) – Rich

7

Non c'è niente di male nel farlo in questo modo. Vorrei suggerire di creare una variabile statica per il vostro Gson istanza e consentire abbastanza stampa:

static Gson gson = new GsonBuilder().setPrettyPrinting().create(); 

In questo modo l'output da toString metodo verrà formattato.

+0

Perché nuovo GsonBuilder(). SetPrettyPrinting(). Perché non solo "new Gson()"? –

+2

l'ho preso dopo un po 'di ricerca su google. Avrei dovuto farlo prima. L'uso della stampa carina sarà abbastanza utile –

0

Fa male alle prestazioni perché Gson usa l'introspezione per capire quali campi stampare.

A parte questo, penso che sia ok. Non è l'implementazione standard di Java toString, ma non penso che cambiarlo sarebbe un anti-modello.

+2

La tua risposta non offre prove o argomenti diversi da "I think", che non è molto utile :-( – Rich

2

NOTA: Se si utilizza tale GSON piuttosto la stampa nel vostro metodo toString() sta andando a guardare come spazzatura nel vostro debugger perché sarà pieno di a capo.

(Spiacente, non ho avuto abbastanza rep per commentare sopra)

+0

Non sei sicuro di quale debugger avessi in mente ma IntelliJ e probabilmente altri IDE funzioneranno bene con le nuove righe nell'output 'toString()'. – Rich

Problemi correlati