• SnackMachine是实体
    • Money是值对象

    实体和值对象的区分很重要,当下有两个类——SnackMachineMoney。它们看起来差不多,但在语义上完全不同。SnackMachine是实体,Money是值对象。
    image.png
    相等有三个维度:一是引用相等,如果引用相等,则认为它们相等。而是ID相等,两个对象ID相等,那么它们是相等的。三是结构相等,两个对象字段值相等,那么它们也是相等的。
    image.png
    如何区分实体和值对象呢?实体相等的关键在ID相等,值对象相等的关键在结构相等。实践中,值对象没有id字段。如果两个值对象字段值相等,则认为它们是可以互换的。就好比数字1,如果两个对象都是数字1,那么它们就是相等的。我们不会可以区分这个数字1和那个数字1有什么不同,它们是一样的。相反,即使两台售货机有相同的账户金额,我们也不会认为它们是相同的售货机,因为它们id是完全不同的。比如两个相同名字的人,我们不会认为他们是同一个人。另一个不同点是值对象在某种意义上是不可变的,改变它的方法是重新生成对象。而实体通常是可变的。
    image.png
    在生命周期方面,值对象不能单独存在,必须依赖或属于实体。在我们的例子中,Money类脱离了SnackMachine就毫无意义,它必须被一个或者多个实体包含。反之,Money类就更适合成为实体。从数据库角度来看,值对象是不存在单独的表映射的。关于持久化我们会在之后的章节中介绍。