我在想Java应该在构造函数中添加多少代码?我的意思是,你经常在构造函数中调用辅助方法,但有时会有一些较长的初始化事物,例如对于从文件,用户界面或其他程序中读取的程序,只初始化实例变量,构造函数可能会更长(如果你不使用辅助方法)。我有一些想法,构造函数通常应该简洁明了,不应该吗?这有例外吗?
答案 0 :(得分:12)
如果按照SOLID原则,每个班级应该有一个改变的理由(即做一件事)。因此,构造函数通常不会读取文件,但是您将拥有一个单独的类来构建文件中的对象。
答案 1 :(得分:4)
看看this SO question。即使另一个是C ++,概念仍然非常相似。
答案 2 :(得分:2)
尽可能少地完成对象的初始化。
如果您可以将构造函数的一部分(大约5行作为我的指南)作为一大块逻辑或特定过程进行讨论,那么为了清晰和组织目的,最好将其拆分为单独的方法。
但对他自己来说。
答案 3 :(得分:1)
构造函数应该足够长,但不再是=)
如果要定义多个重载的构造函数,请不要重复代码;相反,将功能整合到其中一个中,以提高清晰度并便于维护。
答案 4 :(得分:1)
正如Knuth所说,“过早优化是万恶之源。”
你应该在投注者中投入多少钱?你需要的一切。这是“渴望”的方法。当 - 并且仅当 - 性能成为问题时,您是否考虑优化它(对于“懒惰”或“过度渴望”的方法)。
答案 5 :(得分:1)
构造函数应该创建对象的最小的通用实例。如何通用?选择从类继承的每个实例或对象必须传递的测试用例 - 即使“有效”仅表示优雅地失败(以编程方式生成的异常)。
维基百科有一个很好的描述:
http://en.wikipedia.org/wiki/Constructor_(computer_science)
有效对象是构造函数的目标,有效并不一定有用 - 可以在初始化方法中完成。
答案 6 :(得分:0)
我的习惯做法是,如果所有构造函数都必须在对象上设置一些字段,那么它可以任意长。如果它太长,则意味着无论如何都要破坏类设计,或者需要将数据打包在一些更复杂的结构中。
另一方面,如果在初始化类字段之前输入数据需要一些更复杂的处理,我倾向于给构造函数提供已处理的数据并将处理移动到静态工厂方法。
答案 7 :(得分:0)
在完成任何有用的工作之前,您的课程可能需要初始化为某个州。
考虑一下。
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。
所以可能涉及的最小初始化
要确保在稍后调用其成员时该类行为正确,只需要完成所有操作。
答案 8 :(得分:0)
构造函数类似于应用程序安装向导,只执行配置。如果实例已准备好对其自身采取任何(可能的)操作,那么构造函数表现良好。