Java中的参数化构造函数

时间:2016-04-15 21:10:59

标签: java constructor factory-pattern

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

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

  • 构造函数中的参数太多
  • 在构造函数中使用public / protected方法(因为子类可以覆盖方法)
  • 狂野计算

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

2 个答案:

答案 0 :(得分:0)

无论您使用工厂方法还是多个构造函数,都只是个人偏好,特别是在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()之前,该对象基本上无效。使用工厂模式时,必须非常小心,确保其他代码无法在不经过工厂的情况下直接创建对象。 (由于其他一些原因,上述课程也很糟糕,但它们与我试图提出的观点无关。)

答案 1 :(得分:0)

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