为某些简单的类自动生成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);
}
答案 0 :(得分:39)
Eclipse 3.5.2(可能还有早期版本)已经提供了此功能。如果您在编辑器中右键单击,您将在Source - >下找到它。生成toString()...
要回答一个关于自动生成toString()
是不是一个坏习惯的问题,我的意见是,事实并非如此。如果生成的代码与您自己编写的代码非常相似,那么为什么还要打字呢?
答案 1 :(得分:31)
我个人喜欢为所有对象实现一个toString方法,因为它有助于调试。
我会考虑使用Apache Commons ToStringBuilder。
您可以使用反射实现一个简单的toString方法,如下所示:
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
使用此方法,如果/何时添加字段,则无需更新toString方法。
答案 2 :(得分:10)
如果你使用lombok,他们会有一个@ToString注释,它会为你生成toString。
为什么使用eclipse而不是使用eclipse生成toString更好的原因是,如果稍后添加,删除或更改类的属性,则还必须重新生成toString。如果您使用lombok,则无需执行此操作。
答案 3 :(得分:5)
添加史蒂夫和唐的答案(+1为他们):
简化您的toString()
方法,确保它不会触发预测(尤其要注意可能为null的字段)。
如果可能,请不要调用您班级的其他方法。至少,请确保您的toString()
方法不会修改您的对象。
并注意愚蠢的异常toString循环:
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);
}
}
}
答案 4 :(得分:2)
在IntelliJ Idea中你可以按alt + insert,Generate弹出窗口会打开;现在选择字段并单击“确定”按钮;就是这样。
进一步提示:在Generate toString对话框中,您可以通过单击模板组合框中的下拉菜单选择模板。如果需要,您可以在此处根据需要选择StringBuffer或任何其他模板。玩它来习惯。我喜欢它:))
答案 5 :(得分:1)
答案 6 :(得分:0)
在向生成的文本的受众添加toString()时要明确。一些框架使用toString()方法生成最终用户可见文本(例如某些Web框架),而许多人使用toString()方法生成调试/开发人员信息。无论哪种方式,请确保在toString实现中具有足够的唯一性以满足您的要求。
toString()的默认JDK实现会生成开发人员信息,所以这通常是我推荐的模式(如果可能的话),但是如果你正在处理一个具有不同想法/期望的项目,你可能会感到困惑......
答案 7 :(得分:0)
刚刚注意到 - 在NetBeans IDE 中,您可以通过选择要为right click->insert code
生成字段的字段来生成toString()方法,或者使用快捷方式ALT+INSERT
然后选择toString( )。
它的样子是:
@Override
public String toString() {
return "ClassName{"+"fieldName="+fieldName+'}';
}
它是调试的好方法,不需要额外的库。
答案 8 :(得分:0)
考虑到包括@Steve在内的一些旧答案,我想根据最新库添加答案。
添加依赖项
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
在您的课堂上
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
public class User {
...
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}
您可以排除以下某些字段
...
@Override
public String toString() {
return ReflectionToStringBuilder.toStringExclude(this, "name"); // Name will be excluded from toString output
}