web-dev-qa-db-fra.com

OK pour utiliser la sortie JSON par défaut pour toString ()?

@Override 
public String toString() { 
    return new Gson().toJson(this);
}

Suis-je en train de briser une bonne pratique, "Joshua" -pattern chose, modèle de conception général ou autre convention en faisant simplement cela comme comportement par défaut pour mes objets de modèle?

toString() ne sera de toute façon utilisé que pour le débogage dans le paradigme (Android) que nous utilisons actuellement. C'est aussi la raison pour laquelle j'aime voir l'objet en JSON car une grande persistance ORM/json se produira via http-> php/python-> mysql et vers le SQLite local.

38
tortal

Oui. Il est correct d'utiliser la bibliothèque GSON/Jackson/Reflections pour implémenter la méthode toString ().

Il existe peu de façons d'implémenter la méthode toString.

  1. Reflections (bibliothèque Apache)

    @Override
    public String toString(){
        return org.Apache.commons.lang3.builder.ReflectionToStringBuilder.toString(this);
    }
    
  2. Implémentation basée sur JSON (GSON, bibliothèques 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 (disponible avec la bibliothèque Apache-commons)

    @Override
    public String toString() {
        return new org.Apache.commons.lang3.builder.ToStringBuilder(this).
            append("field1", field1).
            append("field2", field2).
            toString();
    }
    
  4. Implémentation toString () du noyau dur

    @Override
    public String toString() {
        return new StringBuilder()
            .append("field1:"+field1)
            .append("field2:"+field2)
            .toString();
    }
    
  5. Annotations Lombok: Génère toString () au moment de la compilation

    import lombok.ToString;
    
    @ToString
    public class ToStringExample {}
    
66
Anamika

Il n'y a aucun mal à le faire de cette façon. Je vous suggère de créer une variable statique pour votre instance Gson et d'activer la jolie impression:

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

De cette façon, la sortie de la méthode toString sera formatée.

9
Egor Neliuba

REMARQUE: si vous utilisez cette jolie impression GSon dans votre méthode toString (), cela ressemblera à des ordures dans votre débogueur car il sera plein de retours à la ligne.

(Désolé, nous n'avions pas assez de représentants pour commenter ci-dessus)

4
JWT

C'est mauvais pour les performances, car Gson utilise l'introspection pour déterminer les champs à imprimer.

A part ça, je pense que ça va. Ce n'est pas le standard Java toString implementation mais je ne pense pas que le changer serait un anti-pattern.

0
tbraun