java - 将私有(private)构造函数用于工厂方法?

标签 java immutability private-constructor

假设我正在构建一个不可变的 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/

相关文章:

c++ - friend 类可以在 C++ 中调用私有(private)构造函数吗? (什么是单例)

c++ - 关于包含不可复制成员引用的类的复制构造函数的建议

javascript - Play Framework 1.3.2 中的 Multi-Tenancy 特定国际化

java - Maven 无法下载 tomcat-maven-plugin 快照

rust - 如何解释 Rust 中对可变类型的不可变引用?

debugging - 为什么我的不可变对象(immutable对象)会改变 Scala

c++ - 为什么私有(private)构造函数阻止对象创建 C++

Java套接字编程——连接完成之前套接字超时

java - 在 Java Swing 中将 Excel 数据插入数据库时​​出现 ExceptionInInitializerError

javascript - 在 nodejs 中创建不可变对象(immutable对象)的适当方法