当你开始一个新的POJO课程时你会怎么做?

时间:2009-06-15 22:18:59

标签: java pojo

假设您正在设置POJO。

您在设置课程时定义了什么?

这是我的清单

  • 使用提供的字段创建对象的构造函数(这样我可以使字段成为最终字段,因此不可变)
  • 的toString
  • 等于
  • 哈希码
  • 实现可比较的
  • 获取方法(适用时)
  • [可选]复制可变字段的构造函数 - 以保证类的不变性
  • [可选]定义访问字段和方法的接口。
  • [可选]实现Serializable并实现版本控制方案。

这是过度杀伤还是声音工程?你想添加什么遗漏?

5 个答案:

答案 0 :(得分:6)

如果我知道自己想做什么,通常先写一个测试,然后编写课程让它运行。

答案 1 :(得分:2)

我假设因为你提到了一个版本控制方案,我们讨论的是可持续的类。

我会说你有一个很好的列表,但是(取决于你的ORM引擎),我也倾向于确定什么值(除了自动增量ID),定义任何记录的'唯一性'。

我只提到这一点,因为如果在hashCode中使用ID,hibernate对于Sets有奇怪的行为,因为它可能会在整个过程中途发生变化。

另外值得注意的是,值得花时间查看哪些集合将是Lazy或Eager,尤其是对于toString方法(如果在从持久化上下文中分离时执行toString,则可能导致Lazy-Inits)

答案 2 :(得分:1)

这完全取决于对象必须做什么。例如,如果对象是可变的,则它不应该实现equals和hashCode或具有可比性。如果它永远不会被序列化,那么实现Serializable并担心版本控制是没有意义的。如果对象是不可变的,则不需要复制构造函数。

我通常从一个接口开始,该接口定义系统中某些其他对象希望新对象执行的操作。实现该接口将“拉动”该类的其余部分。

答案 3 :(得分:1)

如果你有很多领域,我会考虑一个建设者 - 如果不可变性那么重要。

就这种矫枉过正而言,它在很大程度上取决于用例。如果这是一个内部对象,可以在你自己的代码中使用,或者在一些密切的合作者中使用,我会说是的,过早地完成所有这些操作绝对是过分的。它使设计变得更难(想想如果你添加一个字段你必须改变多少),并且很可能创建大量不会被使用的代码。

另一方面,如果您正在查看更大的分布式项目或公共API,我认为这会影响基础。至少应该考虑这个列表中的所有内容,即使最终决定该类可以是可变的,例如,至少决定是智能的。

答案 4 :(得分:0)

完全矫枉过正。申请YAGNI。

设计您的类以通过客户端代码执行它们所需的操作,并且可能进行测试。而已。如果您正在编写一个库,那么当然您需要更完整一些。即便如此,通常情况下,在考虑提交之前至少要有三个客户。