具有“太多”参数的构造函数

时间:2013-11-26 01:20:00

标签: java

假设我有一些扩展超类的子类。这些子类的不同之处在于传递给超类的参数。不幸的是,像下面的例子一样,我最终会得到“很多”参数。是否有避免这种情况的一般方法?具有“许多”参数的构造函数是否被视为良好实践?使用getter / setter方法而不是通过构造函数传递每个参数会更好吗?

public abstract class SuperClass {
    private int a;
    private int b;
    .
    .
    private int z;

    public SuperClass(int a, int b, ... int z) {
        this.a = a;
        this.b = b;
        .
        .
        this.z = z;
    }
}

public class SubClass1 extends SuperClass {

    public SubClass1() {
        super(4, 3, ..., 9);
    }
}

public class SubClass2 extends SuperClass {

    public SubClass2() {
        super(1, 7, ..., 2);
    }
}

5 个答案:

答案 0 :(得分:3)

如果您的子类仅在传递给超类的参数方面有所不同,那么您可能正在寻找Builder Pattern。超类的构建器允许您传递所需的任何参数而不会使构造函数混乱,如果您希望子类具有可读性,则可以将调用包装到构建器并从子类构造函数返回其结果。

答案 1 :(得分:1)

通常,具有许多参数的构造函数是代码气味。这意味着您可能有一个打破"Single Responsibility Principle"的类。如果您无法避免,请尝试使用builder模式!

答案 2 :(得分:0)

我的类中没有构造函数,因为每个构造函数实例化的对象的行为可能不同并且难以确定。

答案 3 :(得分:0)

如果参数的数量可以变化,则使用变量arity(" varargs")参数。声明一个数组而不是所有其他实例变量。在方法中,变量arity参数被输入为数组。

private int[] all;

public SuperClass(int... all) {
    this.all = all;
}

你的子类构造函数根本不需要改变。

答案 4 :(得分:0)

要检查的一件事是:SuperClass应该拆分成更简单的类吗?

如果无法做到这一点:如果您有太多参数,那么您可以拥有一个包含参数的特殊类;每个参数都有setter和getter。

可以从属性文件填充值,因此您可以获得常见案例的配置文件。

class SuperClassParam
{
  void seta(int a);
  int geta();

  //...
}

class SuperClass
{
  public SuperClass( SuperClassParam params )
  {
  }