虽然它仅在极少数情况下发生,但我有时需要两个具有相同参数类型的构造函数,当然每个构造函数具有不同的参数角色。这是一个例子:
public class MyClass {
public MyClass(String title, String content) {
// ...
}
public MyClass(String title, String link) {
// ...
}
}
我很想知道你们在这种情况下做了什么?
尽可能交换一个构造函数的参数顺序(嗯,不是 在我的例子中)
放弃战斗并在构造函数
从未发生过,因为它应该通过设计来管理,比如多态/继承
使用设计模式
添加一个虚拟的未使用参数以使它们唯一(不,真的吗?)
...
编辑:不要自我:我刚刚在java.util.HashSet
中发现了一件可怕的事情:(对于JDK类来说非常令人惊讶,即使它的包是私有的)
/* ......
* @param dummy Ignored (distinguishes this constructor from other int, float constructor.)
* ......
*/
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
...
}
答案 0 :(得分:3)
在这种情况下,您可以添加回答类实例的静态方法。如果您有类似类型的参数,则可以更改名称。为了强制使用这些方法,你可以使用一个声明为private的单个无参数构造函数。
答案 1 :(得分:3)
使用Builder Pattern。名为Builder
的嵌套类接受设置,一次接受一个setter方法,build()
方法返回实际的MyClass
对象。
public class MyClass {
private String title;
private String content;
private String link;
public static class Builder {
private String title;
private String content;
private String link;
public void setTitle(String title) { this.title = title; }
public void setContent(String content) { this.content = content; }
public void setLink(String link) { this.link = link; }
public MyClass build() {
return new MyClass(this);
}
}
private MyClass(Builder builder) {
// Validate here.
if (builder.title == null)
throw new IllegalArgumentException("Title is required!");
this.title = builder.title;
this.content = builder.content;
this.link = builder.link;
}
}
这种方式参数不会混淆,并且构造函数不会因所有情况而成倍增加。
答案 2 :(得分:0)
你可能会做这样的事情
public class Link{ /* constructor from string */ }
public class Content{ /* constructor from string */ }
然后单独使用Link和Content类重载MyClass构造函数
答案 3 :(得分:0)
您可以使用带有私有构造函数的命名工厂方法列表:调用者只知道方法的语义,隐藏它们的实现。稍后,如果您愿意,可以在不更改调用者的情况下重构代码。
我发现这个解决方案更适合您的目的,恕我直言,建设者模式是一个过度设计的解决方案(在您的情况下)。
public class MyClass {
private MyClass(String title, String content, String link) {
// ...
}
public static MyClass buildWithLink (String title, String link) {
return new MyClass(title, null, link);
}
public static MyClass buildWithContent (String title, String content) {
return new MyClass(title, content, null);
}
}