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方法的方法很少
@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();
}
注意:如果在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 {}