应该在构造函数中放入多少代码?

我在想Java中构造函数应该放多少代码? 我的意思是,你经常使用辅助方法,你在构造函数中调用它,但有时会有一些更长的初始化事物,例如对于从文件,用户界面或其他程序中读取的程序,只初始化实例变量,构造函数可能会更长(如果你不使用辅助方法)。 我有一些想法,构造函数通常应该简洁明了,不应该吗? 这有例外吗?

如果按照SOLID原则进行操作,每个类都应该有一个改变的理由(即做一件事)。 因此,构造函数通常不会读取文件,但是您将拥有一个单独的类来构建文件中的对象。

看看这个问题 。 即使另一个是C ++,概念仍然非常相似。

只需要完成对象的初始化。

如果您可以将构造函数的一部分(大约5行作为我的指南)作为一大块逻辑或特定过程进行讨论,那么为了清晰和组织目的,最好将其拆分为单独的方法。

但每一个他自己。

构造函数应该足够长,但不再=)

如果要定义多个重载的构造函数,请不要重复代码; 相反,将function整合到其中一个中以提高清晰度并便于维护。

正如Knuth所说,“过早优化是所有邪恶的根源。”

你应该在投注者中投入多少钱? 你需要的一切。 这是“渴望”的方法。 当 – 并且仅当 – 性能成为问题时,您是否考虑优化它(对于“懒惰”或“过度渴望”的方法)。

构造函数应该创建对象的最小的通用实例。 如何通用? 选择从类inheritance的每个实例或对象必须传递的测试用例 – 即使“valid”仅表示优雅地失败(以编程方式生成的exception)。

维基百科有一个很好的描述:

http://en.wikipedia.org/wiki/Constructor_(computer_science)

有效对象是构造函数的目标,有效并不一定有用 – 可以在初始化方法中完成。

我的习惯做法是,如果所有构造函数都需要在对象上设置一些字段,那么它可以任意长。 如果它太长,则意味着无论如何都要破坏类设计,或者需要将数据打包在一些更复杂的结构中。

另一方面,如果在初始化类字段之前输入数据需要一些更复杂的处理,我倾向于给构造函数提供处理过的数据并将处理移动到静态工厂方法。

在完成任何有用的工作之前,您的课程可能需要初始化为某个州。

考虑一下。

public class CustomerRecord { private Date dateOfBirth; public CustomerRecord() { dateOfBirth = new Date(); } public int getYearOfBirth() { Calendar calendar = Calendar.getInstance(); calendar.setTime(dateOfBirth); return calendar.get(Calendar.YEAR); } } 

现在,如果不初始化dateOfBirth成员varialble,则任何后续的getYearOfBirth()调用都将导致NullPointerException。

所以可能涉及的最小初始化

  1. 分配值。
  2. 调用辅助函数。

要确保在稍后调用其成员时该类行为正确,所有这一切都需要完成。

构造函数就像一个应用程序安装向导 ,您只需要进行配置 。 如果Instance准备好对自己采取任何(可能的) Action ,那么Constructor运行良好。