Java 中的参数化构造函数

parameterized constructor in Java

我刚刚和我的练习老师讨论了参数化构造函数。他说拥有两个或更多构造函数是不好的做法,尤其是参数化构造函数。我应该只使用一个空的构造函数来代替构造函数,并使用工厂方法模式进行初始化。

所以这是第一次,我听说过这样的事情。我做了一些研究,但找不到任何相关的东西。我发现的唯一不良做法是:

所以我的问题是,什么是最佳做法?在构造函数中设置实例变量是否可以,还是我应该听从建议并使用工厂方法模式?

是否使用工厂方法或多个构造函数真的只是个人喜好,尤其是 Java 8,您可以轻松地将构造函数引用用作工厂(这就是构造函数的全部 - 一个工厂制作对象的实例)。 class 有多个构造函数是完全没问题的,如果 class 中有太多构造函数,那就是 class 的标志,即 做的太多了,不是说你需要转厂。当 class 需要特定输入有效且 null / 0 不是合理的默认值时,构造函数非常应该被参数化。

但是,您应该避免的是允许对象以无效状态存在。例如,考虑以下 class 和工厂:

public class MyList {

    private Object[] backingArray;

    public void setBackingArray(Object[] backingArray) {
        this.backingArray = backingArray;
    }
}

public class MyListFactory() {

    MyList newMyList(int initialSize) {
         MyList list = new MyList();
         list.setBackingArray(new Object[initialSize]);
         return list;
    }



    MyList newMyList() {
         MyList list = new MyList();
         list.setBackingArray(new Object[defaultSize]);
         return list;
    }
}

这是一个 糟糕设计的例子 因为我可以忽略工厂并直接调用 new MyList() 并且在我也调用 [=14= 之前对象基本上是无效的].使用工厂模式时,您必须非常小心,以确保其他代码不通过工厂就无法直接创建对象。 (以上 class 也有许多其他原因,但它们与我要表达的观点无关)。

最佳实践取决于您,而且取决于您自己。 我建议使用 Project Lombok (https://projectlombok.org)。 您可以在 class @AllArgsConstructor 上使用注释,它将自动创建。您也可以将 @RequiredArgsConstructor 用于最终字段。自动创建 getter 和 setter 有很多可能性。所以你的代码会更短,更易读。