构造函数参数 - 经验法则

2022-09-01 21:38:49

通常,类构造函数应接受的最大参数数是多少?我正在开发一个需要大量初始化数据(目前有10个参数)的类。但是,具有 10 个参数的构造函数感觉不对。这让我相信我应该为每条数据创建一个 getter/setter。不幸的是,getter/setter模式不会强迫用户输入数据,没有它,对象的特征是不完整的,因此是无用的。思潮?


答案 1

有了这么多参数,是时候考虑生成器模式了。创建一个包含所有这些 getter 和 setter 的生成器类,并使用 build() 方法返回您真正尝试构造的类的对象。

例:

public class ReallyComplicatedClass {
    private int int1;
    private int int2;
    private String str1;
    private String str2;
    // ... and so on
    // Note that the constructor is private
    private ReallyComplicatedClass(Builder builder) {
        // set all those variables from the builder
    }
    public static class Builder {
        private int int1;
        private int int2;
        private String str1;
        private String str2;
        // and so on 
        public Builder(/* required parameters here */) {
            // set required parameters
        }
        public Builder int1(int newInt) {
            int1 = newInt;
            return this;
        }
        // ... setters for all optional parameters, all returning 'this'
        public ReallyComplicatedClass build() {
            return new ReallyComplicatedClass(this);
        }
    }
}

在客户端代码中:

ReallyComplicatedClass c = new ReallyComplicatedClass.Builder()
        .int1(myInt1)
        .str2(myStr2)
        .build();

参见《Effective Java Reloaded 》第7-9页,Josh Bloch在JavaOne 2007上的演讲。(这也是有效Java第2版中的第2项,但我手头没有,所以我不能引用它。


答案 2

您可以决定何时足够,并使用引入参数对象作为构造函数(或任何其他方法)。


推荐