一劳永逸地写toString()?

时间:2011-10-17 23:19:16

标签: java tostring

我希望我的所有类都使用Java反射以相同的方式实现toString()。我想出了两种方法。

  1. 创建一个基类,例如MyObject重写toString(),我的所有类都会扩展它,但我不确定它是否有点矫枉过正。

    < / LI>
  2. 使用Eclipse为每个类生成重写的toString()。它的缺点是存在大量代码冗余。

  3. 哪种方法首选?如果您使用Eclipse模板,当您执行New&gt;时,有没有办法自动生成它?类,而不是必须做Source&gt;每次生成toString()?

4 个答案:

答案 0 :(得分:5)

正如Harkness所说,使用commons-lang ReflectionToStringBuilder。

我没有使用基类,而是使用诸如aspectj之类的AOP在编译时将此实现注入到所有类中。

另一个选择是使用像ASM这样的工具在编译时转换类以注入toString方法。两种方法都使用相同的基本概念,ASM是一种更为“原始”的概念。类文件修改的版本。

答案 1 :(得分:3)

ToStringBuilder查看ReflectionToStringBuilder及其子类Apache Commons Lang。后者允许您在基类中一般地实现toString()或将其添加到模板中:

public String toString() {
    return ReflectionToStringBuilder.toString(this);
}

答案 2 :(得分:3)

选项1是一个非常糟糕的主意,因为它没有充分理由对您的实现施加“是一个”约束,并且每个类都必须从相同的基类继承。这甚至不太可能。

选项2也是一个坏主意 - 你在每个类中重复相同的代码 - 维护噩梦并且不添加任何值。

更好的选择是使用实用程序类:

public class MyUtils {

    public static String toString(Object object) {
        // your reflection impl here
    }

}

public class MyClass {

    ...

    public String toString() {
        return MyUtils.toString(this);
    }
}

答案 3 :(得分:2)

您也可以使用lombok执行此操作,请参阅:

http://www.projectlombok.org/features/ToString.html

如果您有兴趣另外生成所有getter,setter,toString,hashCode和equals,可以使用@Data注释,请参阅:

http://www.projectlombok.org/features/Data.html