java - 使用 StringBuilder 覆盖普通 POJO 的 toString() 时避免内存效率低下

标签 java out-of-memory immutability

我正在开发一个项目,我所有的 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 StringBuildertoString() 对以下代码的调用:

@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 方法是不寻常的。

这里没有内存泄漏。是的,您将创建一个 StringBuilderString,但它们将被适本地进行垃圾回收。

随意使用这些形式中的任何一种 - 或者 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/

相关文章:

java - 实现接口(interface)的 Java 类可以自动继承注释吗?

java - 如何管理tomcat中的webapps足迹?

java - Spring Boot 应用程序 - java.lang.OutOfMemoryError : GC overhead limit exceeded 问题

generics - 有没有一种安全的方法可以为函数的不可变和可变变体重用相同的代码?

c++ - 如何修改不可变对象(immutable对象)?

java - Spring - Bean 在过滤器中不可访问

java - android应用程序存储ArrayList内容的最佳方法?

java - 如何将 null 转换为 Throwable super((Throwable)null);

tomcat - 如何增加 JVM 堆大小 YouTrack 5.1

Scala:包含在可变和不可变集合中