如何避免重载构造函数中的代码重复?

时间:2012-05-07 21:48:14

标签: java overloading code-duplication

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

(我已阅读帖子how to reduce the code of constructor overloading,其中最佳答案建议使用关键字"此"。在我的情况下,我想我需要使用"这个"在输入存储之后调用第二个构造函数。但是这会导致编译错误:"调用它必须是构造函数中的第一个语句"。)

示例代码:

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

编辑:我在类构造函数中使用输入对话框调用需要大量的工作(我知道这并不是一个好的做法)。所以我改变了代码示例,引导讨论远离此:)。

6 个答案:

答案 0 :(得分:9)

一种方法是使用init方法:

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

PS:我同意Mike Clark的评论 - 提示用户输入值的行无法移出构造函数之外。

答案 1 :(得分:4)

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

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

老实说,你真的想要在这里重载构造函数。

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:1)

我认为这是首选方法:

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

答案 4 :(得分:0)

我不确定从构造函数中调用类似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);
  }
}

答案 5 :(得分:0)

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

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

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

在所有情况下这可能并不理想,但这是解决我未提及的问题的另一种方法。