我正在开发一个项目,我所有的 POJO 都必须覆盖 toString()
继承自 Object class
。
考虑下面的不可变类:
public final class SomeActivity {
private final int id;
private final String name;
private final String description;
private final DateTime startDate;
private final DateTime endDate;
private final String note;
// Constructors and getters
// My future implementation of toString
}
我重写 toString()
的目标是实现并输出类似于下面的输出(使用所有 SomeActivity
类字段的测试值):
[Id: 1, Name: Read a book, Description: Trying to discover how to build a plane, StartDate: 17/10/2013, EndDate: 15/11/2013, 注意:我真的需要这个]
所以,我想到了两个解决方案:
1 - 连接字符串
据我所知,String
是一个不可变类。 (请参阅 javadoc ),因此,如果我实现一个方法来接收此类输出,我可能会因为我的连接而创建许多对象:
@Override
public String toString() {
String s = "[Id: " + id +
", Name: " + name +
", Description: " + description +
", StartDate: " + startDate +
", EndDate: " + endDate +
", Note: " + note +
"]";
}
2 - 使用 StringBuilder
使用 StringBuilder
方法,理论上,我将有更少的对象被实例化,而不是“串联方法”。但请注意 new StringBuilder
和 toString()
对以下代码的调用:
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("[Id: ").append(id)
.append(", Name: ").append(name)
.append(", Description: ").append(description)
.append(", StartDate: ").append(startDate)
.append(", EndDate: ").append(endDate)
.append(", Note: ").append(note)
.append("]");
return builder.toString();
}
第二种选择,真的是最好的吗?或者我应该采用另一种方法吗?考虑那些从 loop
语句调用的 toString
方法。
不幸的是,我对内存测试不是很熟悉,所以如果可以为此编写测试,我会很高兴知道这一点。
提前致谢。
最佳答案
As far I know, String is a immutable class. (refer to the javadoc), so, if I implement a method to receive such output, I may have many objects being created because of my concatenations:
没有。当您在单个大型表达式中执行所有连接时,编译器几乎只会为您创建 StringBuilder
等效代码。
But notice new StringBuilder and toString() calls of the code below:
嗯,是的 - 还有?创建使用各种不同字段值但没有创建字符串的toString
方法是不寻常的。
这里没有内存泄漏。是的,您将创建一个 StringBuilder
和 String
,但它们将被适本地进行垃圾回收。
随意使用这些形式中的任何一种 - 或者 String.format
,也许 - 任何你觉得最容易阅读的形式。如果您使用第一种形式,我会将其重新格式化为每行有一个描述和一个字段值:
return "["
+ "Id: " + id
+ ", Name: " + name
+ ", Description: " + description
+ ", StartDate: " + startDate
+ ", EndDate: " + endDate
+ ", Note: " + note
+ "]";
在这一点上,就可读性和添加/删除字段的便利性而言,它看起来更像是第二种形式。
关于java - 使用 StringBuilder 覆盖普通 POJO 的 toString() 时避免内存效率低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19430413/