【问题标题】:Constructors with "too many" parameters [duplicate]具有“太多”参数的构造函数[重复]
【发布时间】:2013-11-26 01:19:59
【问题描述】:

假设我有一些扩展超类的子类。这些子类的不同之处在于传递给超类的参数。不幸的是,就像下面的例子一样,我可以得到“许多”参数。有没有避免这种情况的一般方法?具有“许多”参数的构造函数是否被认为是好的做法?使用 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);
    }
}

【问题讨论】:

  • 您可以尝试使用数组int[]
  • 在不了解应用程序的具体架构的情况下,很难说。一般来说,我避免在构造函数中添加额外的鹦鹉,而不是让函数运行绝对需要。
  • Christian,对不起,我以 int 为例。我的意思是类型可能不同的参数。

标签: java


【解决方案1】:

如果您的子类仅在传递给超类的参数方面有所不同,您可能正在寻找Builder Pattern。超类的构建器可让您传入所需的任何参数,而不会弄乱您的构造函数,如果您希望子类具有可读性,您只需包装对构建器的调用并从子类构造函数返回其结果。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        需要检查的一点是:是否应该将 SuperClass 拆分为更简单的类?

        如果这不能做到:如果你有太多参数,那么你可以有一个特殊的类来保存参数;每个参数都有 setter 和 getter。

        可以从属性文件中填写值,因此您可以拥有常见情况的配置文件。

        class SuperClassParam
        {
          void seta(int a);
          int geta();
        
          //...
        }
        
        class SuperClass
        {
          public SuperClass( SuperClassParam params )
          {
          }
        

        【讨论】:

          【解决方案5】:

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

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

          您的子类构造函数根本不必更改。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-04
            • 2011-04-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-05
            相关资源
            最近更新 更多