【问题标题】:What are the shortcut to Auto-generating toString Method in Eclipse?在 Eclipse 中自动生成 toString 方法的快捷方式是什么?
【发布时间】:2011-02-08 20:14:35
【问题描述】:

为一些简单的类自动生成 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);
}

【问题讨论】:

标签: java automation tostring


【解决方案1】:

考虑到包括@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 
    }

【讨论】:

    【解决方案2】:

    添加到史蒂夫和唐的答案(为他们+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);
               }
    
           }
    
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        看起来是这样的:

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

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

        【讨论】:

          【解决方案5】:

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


          1. Alt + Shift + S + S(双键)
          2. 右键 -> Source -> Generate toString() ...
          3. 转到 源菜单 -> 生成 toString() ...
          4. 转到 Windows 菜单 -> 首选项 -> 常规 -> 键(在文本字段上写入 Generate toString)

          【讨论】:

            【解决方案6】:

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

            使用这种方法比使用 eclipse 生成 toString 要好得多的原因是,如果您以后添加、删除或更改类的属性,您还必须重新生成 toString。如果您使用lombok,则不必这样做。

            【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              要回答您关于自动生成 toString() 是否是一种不好的做法的问题,我认为不是。如果生成的代码与您自己编写的代码非常相似,那何必费心把它打出来呢?

              【讨论】:

              • IDEA 至少从第 8 版开始也是如此(尽管您必须启用该选项)。您在课堂上执行 alt-insert(或右键单击并选择 Generate)。
              • IMO,这并不能回答问题 - OP 询问它是否是最佳实践,而这个答案中没有提到..
              【解决方案9】:

              我个人喜欢为所有对象实现一个 toString 方法,因为它有助于调试。

              我会考虑使用 Apache Commons ToStringBuilder

              您可以使用反射实现一个简单的 toString 方法,如下所示:

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

              使用此方法,如果/当添加字段时,您将不必更新 toString 方法。

              【讨论】:

              • 虽然这确实有一些缺点。您无法控制显示哪些字段,并且反射以缓慢而著称。
              • @Don - 我相信ToStringBuilder 确实提供了更多具有细粒度控制的方法。至于性能,只需考虑何时调用toString()。通常只是在调试时。
              • stackoverflow.com/questions/3149951/… 给出了 ToStringBuilder 的示例或递归使用,stackoverflow.com/questions/6807771/… 具有示例 AspectJ 方面以在许多类中隐式创建 toString
              • !!!仅供参考:使用反射会使函数变慢一个数量级。小心!!
              • @Ajeet 不开玩笑,这就是为什么你没有在 prod 中启用这种类型的日志记录。
              猜你喜欢
              • 1970-01-01
              • 2023-03-27
              • 1970-01-01
              • 2015-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-07
              • 1970-01-01
              相关资源
              最近更新 更多