30

Is it good or bad practice auto-generating toString methods for some simple classes?

I was thinking of generating something like below where it takes the variable names and produces a toString method that prints the name followed by its value.

private String name;
private int age;
private double height;

public String toString(){
   return String.format("Name: %s Age: %d Height %f", name, age, height);
}
4

9 回答 9

44

Eclipse 3.5.2(可能还有更早的版本)已经提供了这个特性。如果您在编辑器中右键单击,您会在 Source -> Generate toString()... 下找到它。

要回答您关于 autogenerate 是否是一种不好的做法的问题toString(),我认为它不是。如果生成的代码与您自己编写的代码非常相似,那么为什么还要费心输入呢?

于 2010-04-16T13:41:08.580 回答
36

I personally like to implement a toString method for all objects, as it helps in debugging.

I would look into using the Apache Commons ToStringBuilder.

You can implement a simple toString method using reflection as follows:

public String toString() {
   return ToStringBuilder.reflectionToString(this);
}

Using this method, you will not have to update your toString method if/when fields are added.

于 2010-04-16T13:37:27.247 回答
12

如果您使用lombok ,他们有一个@ToString注释,它将为您生成 toString。

使用它而不是使用 eclipse 生成 toString 更好的原因是,如果您稍后添加、删除或更改类的属性,您还必须重新生成 toString。如果您使用lombok,则不必这样做。

于 2010-04-20T11:38:22.533 回答
5

添加到史蒂夫和唐的答案(为他们+1):

使您的toString()方法简单,确保它永远不会触发期望(尤其要注意可能为空的字段)。

如果可能,请不要调用您班级的其他方法。至少,请确保您的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);
           }

       }

}
于 2010-04-16T13:59:49.143 回答
2

在 IntelliJ Idea 中,您可以按 alt+insert,Generate 弹出窗口将打开;现在选择字段并单击 OK 按钮;而已。

通过按 alt + insert 生成弹出窗口

选择字段并保留默认模板

生成到字符串函数

进一步提示:在 Generate toString 对话框中,您可以通过单击模板组合框上的下拉菜单来选择模板。如果需要,您可以在此处选择 StringBuffer 或根据需要选择任何其他模板。玩它来习惯。我喜欢 :)

于 2018-04-04T17:17:14.907 回答
1

生成 toString() 方法的快捷方式


  1. Alt + Shift + S + S(双键)
  2. 右键单击-> 源 -> 生成 toString() ...
  3. 转到源菜单-> 生成 toString() ...
  4. 转到Windows 菜单-> 首选项 -> 常规 -> 键(在文本字段上写入生成 toString)
于 2015-10-08T12:23:51.813 回答
0

在添加 toString() 时要清楚生成文本的受众。一些框架使用 toString() 方法来生成最终用户可见文本(例如某些 Web 框架),而许多人使用 toString() 方法来生成调试/开发人员信息。无论哪种方式,请确保您在 toString 实现中具有足够的唯一性以满足您的要求。

toString() 的默认 JDK 实现会生成开发人员信息,所以如果可能的话,这通常是我推荐的模式,但如果你正在处理一个具有不同想法/期望的项目,你可能会感到困惑......

于 2010-04-17T23:47:22.313 回答
0

刚刚注意到 -在 NetBeans IDE中,您可以通过选择要为其生成它的字段right click->insert code或使用快捷方式ALT+INSERT然后选择 toString() 来生成 toString() 方法。

它的外观是:

@Override
public String toString() {
    return "ClassName{"+"fieldName="+fieldName+'}';
}

它是调试的好方法,不需要额外的库。

于 2017-02-24T20:11:45.313 回答
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 
    }
于 2020-05-20T14:37:41.997 回答