假设你正在建立一个POJO。当你开始一个新的POJO课程时,你会做什么?
您在设置课程时定义了什么?
这里是我的名单
- 构造函数来创建与提供的域对象(这样我就可以使场决赛,因此不可变的)
- 的toString
- 等于
- 哈希码
- 实现媲美
- get方法(如适用)
- [可选]为可变字段复制构造函数 - 保证类的不变性
- [可选]定义接口以访问字段和方法。
- [可选]实现Serializable并实现版本控制方案。
这是大材小用还是音响工程?有什么遗漏,你会添加?
假设你正在建立一个POJO。当你开始一个新的POJO课程时,你会做什么?
您在设置课程时定义了什么?
这里是我的名单
这是大材小用还是音响工程?有什么遗漏,你会添加?
我假设因为你提到了一个版本控制方案,我们正在讨论持久化类。我会说你有一个很好的列表,但是(取决于你的ORM引擎),我也倾向于确定什么值(除了自动增量ID),定义任何记录的“唯一性”。
我只提到这一点,因为Hibernate与集怪异的行为,如果你使用的ID中的hashCode,因为它容易经由过程中途改变。
另外值得注意的是,值得你花些时间看看哪些集合将会是Lazy或者Eager,特别是toString方法(如果你从持久化上下文中分离出来的时候做了toString,可能会导致Lazy-Inits )。
这一切都取决于对象必须做什么。例如,如果对象是可变的,它不应该实现equals和hashCode,或者可以比较。如果它永远不会被序列化,那么在实现Serializable并且担心版本控制方面没有意义。如果该对象是不可变的,则不需要复制构造函数。
我通常用它定义了系统中的一些其他对象希望新的对象做一个接口开始。实现这个接口将会“拉”其他课程。
如果你有很多领域,我会考虑一个建设者 - 如果不变性是非常重要的。
就这个矫枉过正而言,它确实取决于很多用例。如果这是一个用于自己的代码或几个密切合作者之间的内部对象,我会说是的,但过早做这些事绝对有点矫枉过正。它使得设计变得更加困难(想想如果添加一个字段,你需要改变多少),而且很可能会创建大量无法使用的代码。
另一方面,如果您正在寻找一个更大的分布式项目或公共API,我认为这符合基本面。至少应该考虑这个清单上的所有内容,即使最终确定该类可以是可变的,例如至少该决定是智能化的。
完整的矫枉过正。申请YAGNI。
设计你的类来完成客户端代码所需的东西,也许测试。而已。如果你正在编写一个图书馆,那么你当然需要更完整一些。即使如此,作为一项规则,在您考虑实施之前至少有三个客户。
请注意,我不会将所有这些都做到所有类。我确实说过一些是可选的。 Comparable是可选的,但在需要将它添加到TreeMaps/TreeSets之前,我已经被咬了,所以如果有逻辑顺序,我通常会添加它。 – Fortyrunner 2009-06-15 22:28:17
OP还在评论中提到了他正在考虑在一个大型项目中做这件事的情况,他们在提交/检查之后事情没有发生太大变化 – Crowie 2013-11-27 13:22:36