【问题标题】:How to avoid code duplication in overloaded constructors?如何避免重载构造函数中的代码重复?
【发布时间】:2012-05-07 21:48:13
【问题描述】:

假设我有一个使用输入的构造函数和另一个使用默认值的构造函数。然后,两个构造函数都以完全相同的方式继续处理这些数据。 (下面的示例。)在这种情况下,我有哪些避免代码重复的选项?

(我已阅读帖子how to reduce the code of constructor overloading,其中最佳答案建议使用关键字“this”。就我而言,我想我需要使用“this”从第二个构造函数调用第一个构造函数输入已被存储。但这会导致编译错误:“调用 this 必须是构造函数中的第一个语句”。)

示例代码:

public class A {
  public A(String a) {
    //process a
  }
  public A() {
    String a = "defaultString";
    //process a
  }
}

编辑:我因在类构造函数中使用输入对话框调用而大受打击(我知道这不是很好的做法)。因此,我更改了代码示例以将讨论引离这个:)。

【问题讨论】:

  • 是否有原因提示用户输入值的行无法移出构造函数,然后所有调用都可以使用相同的构造函数?当您在构造函数中提示用户输入时,这会产生非常糟糕的代码气味。
  • 注明。然而,这只是一个一次性的介绍性锻炼计划,我并不是很严格。

标签: java overloading code-duplication


【解决方案1】:

一种方法是有一个 init 方法:

public class A {
    public A(String a) {
        init(a);
    }
    public A() {
        String a = "defaultString";
        init(a);
    }
    private void init(String a) {
        //process a
    }
}

【讨论】:

    【解决方案2】:

    假设我有一个构造函数接受输入,而另一个构造函数通过输入对话框请求输入。

    不要那样做。从长远来看,这将导致可怕的纠缠和难以维护的代码。至少尝试将 UI 问题(输入对话框等)与您的 object 模型(您可以在构造函数中提供 string )分开。

    老实说,你真的希望这里有一个重载的构造函数。

    【讨论】:

      【解决方案3】:

      您可能想尝试链接您的构造函数:

      public class A {
        public A(String a) {
          //process a
        }
        public A() {
          this("defaultString");
        }
      }
      

      如果您想使用对话框来获取字符串,我建议您在调用此构造函数之前显示对话框

      【讨论】:

        【解决方案4】:

        我认为这是首选方法:

        public class A {
          public A(String a) {
            //process a
          }
          public A() {
            this(JOptionPane.showInputDialog("a"));
          }
        }
        

        【讨论】:

          【解决方案5】:

          我不确定从构造函数中调用 JOptionPane 之类的东西是否是个好主意。这只是一个想法,但您确实应该从静态方法中获取 buildA 并在您实际打算询问用户输入的地方执行它,然后只需调用单个构造函数。

          public class A {
            public A(String a) {
              this.a = a;
            }
            public static A buildA(String input){
              if(input == null){
                input = JOptionPane.showInputDialog("a"); 
              }
              return new A(input);
            }
          }
          

          【讨论】:

          • 是的,你是对的,对话框应该移出构造函数。但是,最好将其从对象中完全删除,包括从任何static 方法中
          • @X-Zero 我完全同意。我将在我说这应该在课堂外完成的部分加粗。
          • #headdesk# - 抱歉,我之前错过了。
          【解决方案6】:

          减少构造函数之间代码重复的另一个选择是使用初始化块。初始化块代码将在构造函数之前运行

          使用此方法,您可以将通用代码放入初始化程序块中,然后将不同的逻辑留在特定的构造函数中。

          public class A {
            {
               //initializer block - common code here
            }
            public A(String a) {
              //constructor - specific code here
            }
            public A() {
              //constructor - specific code here
            }
          }
          

          这可能并不适用于所有情况,但它是解决我尚未看到的问题的另一种方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-10-23
            • 1970-01-01
            • 1970-01-01
            • 2021-10-16
            • 1970-01-01
            • 1970-01-01
            • 2017-01-10
            • 1970-01-01
            相关资源
            最近更新 更多