ОК для использования вывода JSON по умолчанию для toString()?

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

Я нарушаю некоторые хорошие практики, "Джошуа" -pattern, общий шаблон дизайна или другое соглашение, просто делая это как поведение по умолчанию для моих объектов модели?

toString() будет использоваться только для отладки в парадигме (Android), которую мы сейчас используем. Это также причина, по которой мне нравится видеть объект в JSON, так как упорство ORM/json будет происходить через http-> php/python-> mysql и локальный SQLite.

Ответ 1

Да. Можно использовать библиотеку GSON/Jackson/Reflections для реализации метода toString().

Есть несколько способов реализовать метод toString.

  1. Размышления (библиотека Apache)

    @Override
    public String toString(){
        return org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(this);
    }
    
  2. Реализация на основе JSON (библиотеки GSON, 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 (доступно с библиотекой apache-commons)

    @Override
    public String toString() {
        return new org.apache.commons.lang3.builder.ToStringBuilder(this).
            append("field1", field1).
            append("field2", field2).
            toString();
    }
    
  4. Жесткая реализация toString()

    @Override
    public String toString() {
        return new StringBuilder()
            .append("field1:"+field1)
            .append("field2:"+field2)
            .toString();
    }
    
  5. Аннотации Lombok: генерирует toString() во время компиляции

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

Ответ 2

Там нет вреда в этом. Я бы предложил вам создать статическую переменную для вашего экземпляра Gson и включить довольно печатную Gson:

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

Таким образом будет отформатирован вывод метода toString.

Ответ 3

ПРИМЕЧАНИЕ. Если вы используете эту печатную версию GSon в своем методе toString(), она будет выглядеть как мусор в вашем отладчике, потому что она будет заполнена новыми символами.

(Извините, не хватило репутации для комментариев выше)

Ответ 4

Это плохо для производительности, потому что Gson использует интроспекцию, чтобы выяснить, какие поля печатать.

Кроме того, я думаю, что все в порядке. Это не стандартная реализация Java toString, но я не думаю, что ее изменение будет анти-шаблоном.