Java中的参数化构造函数

Java中的参数化构造函数,java,constructor,factory-pattern,Java,Constructor,Factory Pattern,我刚刚和我的练习老师讨论了参数化构造函数。他说有两个或更多的构造函数是不好的做法,尤其是参数化的构造函数。我应该只使用一个空构造函数来初始化工厂方法模式,而不是构造函数 这是我第一次听到这样的话。我做了一些研究,但找不到任何相关的。我发现的唯一不好的做法是: 构造函数中的参数太多 在构造函数内使用公共/受保护方法(因为子类可以重写这些方法) 胡思乱想 所以我的问题是,什么是最佳实践?在构造函数中设置实例变量可以吗?还是应该按照建议使用工厂方法模式?使用工厂方法还是使用多个构造函数实际上只是个

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

这是我第一次听到这样的话。我做了一些研究,但找不到任何相关的。我发现的唯一不好的做法是:

  • 构造函数中的参数太多
  • 在构造函数内使用公共/受保护方法(因为子类可以重写这些方法)
  • 胡思乱想

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

使用工厂方法还是使用多个构造函数实际上只是个人偏好,特别是在Java 8中,您可以轻松地将构造函数引用用作工厂(这就是构造器的真正含义——一个用于生成对象实例的工厂)。一个类有多个构造函数是很好的,如果一个类中有太多的构造函数,这是一个类做得太多的标志,而不是说你需要切换到工厂。当一个类需要特定的输入有效且
null
/
0
不是一个正常的默认值

您应该避免的是允许一个对象处于无效状态。例如,考虑下面的类和工厂:

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()
,并且该对象在我调用
setBackingArray()之前基本上是无效的
。在使用工厂模式时,必须非常小心,确保其他代码不经过工厂就无法直接创建对象。(上述类由于许多其他原因也不好,但它们与我试图阐述的观点无关)。

最佳实践取决于您,也取决于您自己。 我建议使用projectlombok()。
您可以在类@AllArgsConstructor上使用注释,它将自动创建。您也可以在最终字段中使用@RequiredArgsConstructor。自动创建getter和setter的可能性很多。因此,您的代码将更短,可读性更强。

这只是他的观点,伙计。有多个构造函数是可以的,但是如果你不链接它们,你可能会得到不一致的结果,例如,我建议你正确使用术语,你可能指的是“实例变量”,而不是“类变量”,你指的是构建器模式?我建议阅读Josh BlochI的文章,怀疑他所指的“工厂方法模式”是什么意思这是两件截然不同的事情:第一件事依赖于类继承的使用,而第二件事根本不是一种“模式”,而是一种“习惯用法”。