Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在实现toString()时使用反射有意义吗?_Java_Json_Reflection_Orm_Gson - Fatal编程技术网

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

Java 在实现toString()时使用反射有意义吗?,java,json,reflection,orm,gson,Java,Json,Reflection,Orm,Gson,我是否打破了一些好的实践,“约书亚”模式的东西,一般的设计模式或其他惯例,只是简单地将其作为我的模型对象的默认行为 toString()无论如何只能用于我们当前使用的范例(Android)中的调试。这也是我喜欢在JSON中看到对象的原因,因为很多ORM/JSON持久化将通过http->php/python->mysql和本地SQLite进行。这样做没有什么害处。我建议您为Gson实例创建一个静态变量,并启用漂亮的打印: @Override public String toString() {

我是否打破了一些好的实践,“约书亚”模式的东西,一般的设计模式或其他惯例,只是简单地将其作为我的模型对象的默认行为


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

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

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

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

这对性能不利,因为Gson使用内省来确定要打印哪些字段


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

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

实现toString方法的方法很少

  • 反射(Apache库)

  • 基于JSON的实现(GSON、Jackson库)

  • ToStringBuilder(可从apache commons库获得)

  • 硬核toString()实现

    @Override
    public String toString() {
        return new org.apache.commons.lang3.builder.ToStringBuilder(this).
            append("field1", field1).
            append("field2", field2).
            toString();
    }
    
  • Lombok注释:在编译时生成toString()

    @Override
    public String toString() {
        return new StringBuilder()
            .append("field1:"+field1)
            .append("field2:"+field2)
            .toString();
    }
    

  • 注意:如果在toString()方法中使用GSon pretty printing,那么它在调试器中看起来就像垃圾,因为它将充满新行


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

    你没有破坏任何东西
    toString()
    可以返回任何字符串(但每次在同一实例上调用它时,它可能会返回相同的字符串,除非实例的内部状态发生更改)。@SotiriosDelimanolis:如果实例的内部状态发生更改,则不会返回。@JBNizet是的,我应该用文字表达(即剽窃您的注释).@tortal我说的是一般情况。当然,Gson会做到这一点。有很多可能的问题需要注意——昂贵的按需加载集合(性能)、双向引用(无止境循环)、大型对象树的根对象(调试语句中的整个数据库)等等。这就是为什么在一般情况下我不做generic&reflection-basedtostring()。但不确定是否有这种情况在这里适用。为什么要新建GsonBuilder().setPrettyPrinting()。为什么不只是“new Gson()”?我在谷歌上搜索了一下才得到它。我应该先这么做。使用漂亮的打印将非常有用,我想
    toJson(obj)
    您是想表明这一点的
    toString()
    不会打印出任何有用的内容。惊人的答案,非常详细,有几个选项,只需几行。这应该是可以接受的。答案可以通过讨论JSON序列化的契约以及JSON序列化是否符合该契约(我认为它符合)以及任何潜在的缺点(性能?但通过契约得到缓解-该方法是用于调试/显示的,因此预期不会有性能)来改进是的,我想知道使用Jackson与仅使用普通反射打印对象状态的性能。使用Jackson打印出一个对象似乎太过分了。选项1中的代码也更简洁。您的答案除了“我认为”之外,没有提供任何证据或论据,这不是很有用:-(@tdraun是的,内省的代价很高,所以你是对的,还有其他的考虑。那个有钱人只是说了一些天真的猜测,也就是BS。我同意,你的答案其实很好。没有理由抨击你的答案,因为你包括了“我想”这几个字。不确定您想使用哪个调试器,但IntelliJ和其他IDE可能可以很好地处理
    toString()
    输出中的换行符。
    // 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;
    }
    
    @Override
    public String toString() {
        return new org.apache.commons.lang3.builder.ToStringBuilder(this).
            append("field1", field1).
            append("field2", field2).
            toString();
    }
    
    @Override
    public String toString() {
        return new StringBuilder()
            .append("field1:"+field1)
            .append("field2:"+field2)
            .toString();
    }
    
    import lombok.ToString;
    
    @ToString
    public class ToStringExample {}