为一些简单的类自动生成toString
方法是好还是坏?
我正在考虑生成类似下面的内容,它采用变量名称并生成一个toString
方法,该方法打印名称后跟其值。
private String name;
private int age;
private double height;
public String toString(){
return String.format("Name: %s Age: %d Height %f", name, age, height);
}
Eclipse 3.5.2(可能还有早期版本)已经提供了这个功能。如果在编辑器中右键单击,您将在Source - > Generate toString()下找到它...
为了回答你关于自动生成toString()
是不好的问题,我的观点是它不是。如果生成的代码与您自己编写的代码非常相似,那么为什么还要打字呢?
我个人喜欢为所有对象实现一个toString方法,因为它有助于调试。
我会考虑使用Apache Commons ToStringBuilder。
您可以使用反射实现一个简单的toString方法,如下所示:
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
使用此方法,如果/添加字段,则不必更新toString方法。
添加史蒂夫和唐的答案(+1为他们):
使你的qazxsw poi方法简单,确保它永远不会触发期望(尤其要注意可能为null的字段)。
如果可能,请不要调用您班级的其他方法。至少,请确保您的toString()
方法不会修改您的对象。
并注意愚蠢的异常toString循环:
toString()
在IntelliJ Idea中你可以按alt + insert,Generate popup会打开;现在选择字段并单击“确定”按钮;而已。
public class MyClass {
...
public String toString() {
// BAD PRACTICE 1: this can throw NPE - just use field1
return " field1=" + field1.toString()
+ " extraData=" + getExtraData();
// BAD PRACTICE 2: potential exception-toString loop
}
public MyExtraData getExtraData() {
try {
.... do something
} catch(Exception e) {
throw new RuntimeException("error getting extradata - " + this.toString(),e);
}
}
}
进一步提示:在Generate toString对话框中,通过单击模板组合框上的下拉菜单,您可以选择模板。如果需要,您可以在此处根据需要选择StringBuffer或任何其他模板。玩它来习惯。我喜欢 :)
在为生成的文本的受众添加toString()时要清楚。一些框架使用toString()方法生成最终用户可见文本(例如某些Web框架),而许多人使用toString()方法生成调试/开发人员信息。无论哪种方式,请确保在toString实现中具有足够的唯一性以满足您的要求。
toString()的默认JDK实现会生成开发人员信息,因此通常情况下我推荐使用的模式,但如果您正在处理具有不同想法/期望的项目,您可能会感到困惑......