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

Java 当你开始一个新的POJO课程时,你会做什么?,java,pojo,Java,Pojo,假设您正在设置POJO 设置类时,您定义了什么 这是我的清单 构造函数使用提供的字段创建对象(这样我就可以使字段成为最终字段,因此是不可变的) 托斯特林 相等于 哈希码 实现可比性 获取方法(如适用) [可选]复制可变字段的构造函数-以保证类的不变性 [可选]定义访问字段和方法的接口 [可选]实现可序列化并实现版本控制方案 这是过度杀伤力还是合理的工程?还有什么你想补充的吗 这完全取决于对象必须做什么。例如,如果对象是可变的,那么它不应该实现equals和hashCode,也不应该是可比较的

假设您正在设置POJO

设置类时,您定义了什么

这是我的清单

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

这是过度杀伤力还是合理的工程?还有什么你想补充的吗

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


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

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


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

如果我知道我要做什么,通常先编写测试,然后编写类使其运行。

如果我知道我要做什么,通常先编写测试,然后编写类使其运行。

我假设,因为您提到了版本控制方案,我们讨论的是持久类

我想说您有一个很好的列表,但是(取决于您的ORM引擎),我还倾向于确定哪些值(除了自动增量ID)定义了任何记录的“唯一性”

我之所以提到这一点,是因为如果在hashCode中使用ID,hibernate对set有着奇怪的行为,因为它很容易在过程的中途改变


还值得注意的是,值得花时间看看哪些集合将是惰性的或急切的,特别是对于toString方法(如果在与持久性上下文分离时执行toString,则可能会导致惰性初始化)。

我假设,因为您提到了版本控制方案,我们讨论的是持久类

我想说您有一个很好的列表,但是(取决于您的ORM引擎),我还倾向于确定哪些值(除了自动增量ID)定义了任何记录的“唯一性”

我之所以提到这一点,是因为如果在hashCode中使用ID,hibernate对set有着奇怪的行为,因为它很容易在过程的中途改变


还值得注意的是,值得注意的是,哪些集合将是懒惰或急切的,特别是对于ToStand方法(如果您在从持久化上下文中分离出ToStin时,这可能会导致Lazy Inits)。< P>如果你有很多字段,我会考虑一个生成器——如果不可变是很重要的。 就这种过度杀伤力而言,这在很大程度上取决于用例。如果这是一个内部对象,可以在您自己的代码中使用,或者在一些密切的合作者中使用,那么我会说是的,过早地完成这一切肯定是过分的。这使得设计的改进变得更加困难(想想如果你添加一个字段,你需要改变多少),而且很可能会创建很多无法使用的代码


另一方面,如果您正在研究一个更大的分布式项目或公共API,我认为这符合基本原理。至少,这个列表中的所有东西都应该被考虑,即使最终决定类可以是可变的,例如,至少这个决定是明智的。

如果你有很多字段,我会考虑一个生成器——如果不可变是很重要的。< /P> 就这种过度杀伤力而言,这在很大程度上取决于用例。如果这是一个内部对象,可以在您自己的代码中使用,或者在一些密切的合作者中使用,那么我会说是的,过早地完成这一切肯定是过分的。这使得设计的改进变得更加困难(想想如果你添加一个字段,你需要改变多少),而且很可能会创建很多无法使用的代码


另一方面,如果您正在研究一个更大的分布式项目或公共API,我认为这符合基本原理。至少,应该考虑这个列表上的所有内容,即使最终决定类可以是可变的,例如,至少这个决定是明智的。

完全过份了。应用雅格尼


设计类来完成客户机代码所要求的工作,也许还需要进行测试。没别的了。如果您正在编写一个库,那么您当然需要更加完整。即便如此,作为一项规则,在考虑提交之前,至少要有三个客户机

完全过度杀戮。应用雅格尼


设计类来完成客户机代码所要求的工作,也许还需要进行测试。没别的了。如果您正在编写一个库,那么您当然需要更加完整。即便如此,作为一项规则,在考虑提交之前,至少要有三个客户机

注意,我并不是对所有类都做这些。我确实说过有些是可选的。Compariable有点可选,但我以前在需要将其添加到TreeMap/TreeSets时被咬过,所以如果有逻辑顺序,我通常会添加这个。OP也在answe的评论中提到