假设我正在构建一个不可变的 Yahtzee 记分卡类:
public final class Scorecard {
private Map<Category, Integer> scorecard = new HashMap<Category, Integer>();
public Scorecard() {
// Instantiates a new empty scorecard
}
private Scorecard(Map<Category, Integer> scorecard) {
this.scorecard = scorecard;
}
public Scorecard withScore(Category category, int[] roll) {
newScorecard = new HashMap<Category, Integer>(scorecard); // Pretend that this is a deep-copy
newScorecard.put(category, calculateScoreFromRoll(roll));
return new Scorecard(newScorecard);
}
public int getScore(Category category) {
return scorecard.get(category);
}
}
基本上我不想公开类的内部结构。如果我没有私有(private)构造函数,那么我将需要使用带有 Map
参数的公共(public)构造函数,就像私有(private)构造函数一样(而且我可能会丢失 withScore()
方法)以允许评分。但这是执行工厂方法的有效方法吗?
最佳答案
一个非常常见且好的模式是拥有所有私有(private)构造函数和公共(public)静态工厂方法:
public class MyClass {
private MyClass() {}
public static MyClass fromA(A foo) {
MyClass o = new MyClass();
o.field = bar; // etc
return o;
}
public static MyClass fromB(B foo) {
MyClass o = new MyClass();
o.field = bar; // etc
return o;
}
}
注意:这允许具有相同参数类型的不同工厂方法,这是构造函数所不允许的。
关于java - 将私有(private)构造函数用于工厂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23438566/