ОК для использования вывода 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.
-
Размышления (библиотека Apache)
@Override
public String toString(){
return org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(this);
}
-
Реализация на основе 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;
}
-
ToStringBuilder (доступно с библиотекой apache-commons)
@Override
public String toString() {
return new org.apache.commons.lang3.builder.ToStringBuilder(this).
append("field1", field1).
append("field2", field2).
toString();
}
-
Жесткая реализация toString()
@Override
public String toString() {
return new StringBuilder()
.append("field1:"+field1)
.append("field2:"+field2)
.toString();
}
-
Аннотации 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, но я не думаю, что ее изменение будет анти-шаблоном.