5

我正在开发一个项目,我的所有 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, Note: I really need this]

所以,我想到了两个解决方案:

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();
}

这第二种选择,真的是最好的吗?还是我应该采用另一种方法?考虑从语句toString中调用的那些方法。loop

不幸的是,我对内存测试不是很熟悉,所以如果可以为此编写测试,我会很高兴知道这一点。

提前致谢。

4

2 回答 2

8

据我所知,String 是一个不可变的类。(参考javadoc),所以,如果我实现一个方法来接收这样的输出,我可能会因为我的串联而创建了很多对象:

没有。当您在单个大表达式中执行所有连接时,编译器几乎只会StringBuilder为您创建 - 等效代码。

但请注意下面代码的新 StringBuilder 和 toString() 调用:

嗯,是的 - 而且?toString创建一个使用各种不同字段值但创建字符串的方法是不寻常的。

这里没有内存泄漏。是的,您将创建一个StringBuilderand String,但它们将被适当地垃圾收集。

随意使用这些形式中的任何一种——或者String.format,也许——任何你觉得最容易阅读的形式。如果您使用第一种形式,我会将其重新格式化为每行有一个描述和一个字段值:

return "["
    + "Id: " + id 
    + ", Name: " + name 
    + ", Description: " + description
    + ", StartDate: " + startDate 
    + ", EndDate: " + endDate 
    + ", Note: " + note
    + "]";

在这一点上,就可读性和添加/删除字段的易用性而言,它看起来更像第二种形式。

于 2013-10-17T15:09:42.507 回答
0

来自 apache commons 的ToStringBuilder有一种非常简洁的方式来生成 toString 实现。

   public class Person {
    String name;
    int age;
    boolean smoker;
   } 


   public String toString() {
     return new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       append("smoker", smoker).
       toString();
   }
 }

这将产生一个 toString 的格式:

Person@7f54[name=Stephen,age=29,smoker=false]

于 2019-09-18T09:38:30.640 回答