在实现 toString() 时使用反射有意义吗?

2022-08-31 22:23:08
@Override 
public String toString() { 
    return new Gson().toJson(this);
}

我是否打破了一些良好的实践,“Joshua”模式的东西,一般的设计模式或其他约定,只是这样做作为我的模型对象的默认行为?

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


答案 1

是的。可以使用GSON/Jackson/Reflections库来实现toString()方法。

实现 toString 方法的方法很少。

  1. Reflections (Apache library)

    @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. 硬核到弦()实现

    @Override
    public String toString() {
        return new StringBuilder()
            .append("field1:"+field1)
            .append("field2:"+field2)
            .toString();
    }
    
  5. 龙目岛注释:在编译时生成 toString()

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

答案 2

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

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

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