我希望我的所有类都使用Java反射以相同的方式实现toString()
。我想出了两种方法。
创建一个基类,例如MyObject
重写toString()
,我的所有类都会扩展它,但我不确定它是否有点矫枉过正。
使用Eclipse为每个类生成重写的toString()
。它的缺点是存在大量代码冗余。
哪种方法首选?如果您使用Eclipse模板,当您执行New>时,有没有办法自动生成它?类,而不是必须做Source>每次生成toString()?
答案 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
注释,请参阅: