假设我有一个接受输入的构造函数和另一个使用默认值的构造函数。然后,两个构造函数都以完全相同的方式继续处理这些数据。 (以下示例。)在这种情况下,我有哪些选择可以避免代码重复?
(我已阅读帖子how to reduce the code of constructor overloading,其中最佳答案建议使用关键字"此"。在我的情况下,我想我需要使用"这个"在输入存储之后调用第二个构造函数。但是这会导致编译错误:"调用它必须是构造函数中的第一个语句"。)
示例代码:
public class A {
public A(String a) {
//process a
}
public A() {
String a = "defaultString";
//process a
}
}
编辑:我在类构造函数中使用输入对话框调用需要大量的工作(我知道这并不是一个好的做法)。所以我改变了代码示例,引导讨论远离此:)。
答案 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
}
}
在所有情况下这可能并不理想,但这是解决我未提及的问题的另一种方法。