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

我是否打破了一些好的习惯,“约书亚”模式通过简单地将其作为我的模型对象的默认行为来

toString()无论如何,仅用于在我们当前使用的范例(Android)中进行调试。这也是我喜欢在 JSON 中看到对象的原因,因为许多 ORM/json 持久性将通过 http->php/python->mysql 和本地 SQLite 发生。

4

4 回答 4

89

是的。可以使用 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 {}
    
于 2016-08-22T22:29:53.750 回答
10

这样做没有坏处。我建议您为您的Gson实例创建一个静态变量并启用漂亮的打印:

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

这样,方法的输出toString将被格式化。

于 2015-04-27T15:26:03.257 回答
4

注意:如果你在 toString() 方法中使用 GSon 漂亮的打印,它在你的调试器中看起来就像垃圾,因为它会充满换行符。

(抱歉没有足够的代表在上面发表评论)

于 2017-11-07T03:48:54.393 回答
2

这对性能不利,因为 Gson 使用自省来确定要打印的字段。

除此之外,我觉得还可以。这不是标准的 Java toString 实现,但我不认为改变它是一种反模式。

于 2015-08-26T13:17:04.867 回答