5

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

(我已经阅读了如何减少构造函数重载代码的帖子,其中最佳答案建议使用关键字“this”。就我而言,我想我需要使用“this”从第二个构造函数调用第一个构造函数存储输入之后的一个。然而,这会导致编译错误:“调用 this 必须是构造函数中的第一个语句”。)

示例代码:

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

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

4

6 回答 6

10

一种方法是使用 init 方法:

public class A {
    public A(String a) {
        init(a);
    }
    public A() {
        String a = "defaultString";
        init(a);
    }
    private void init(String a) {
        //process a
    }
}
于 2012-05-07T21:50:33.683 回答
5

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

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

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

于 2012-05-07T21:54:25.273 回答
3

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

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

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

于 2012-05-08T15:36:50.050 回答
1

我认为这是首选方法:

public class A {
  public A(String a) {
    //process a
  }
  public A() {
    this(JOptionPane.showInputDialog("a"));
  }
}
于 2012-05-07T21:54:11.033 回答
0

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

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

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

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

于 2012-05-07T22:09:18.823 回答
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);
  }
}
于 2012-05-07T21:54:12.030 回答