购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.2 值

在英语中,值(value)是一个拥有多重含义的术语。在计算机领域,我们说变量、参数和字段都有值,指的是它们所绑定的原语或引用。在本书中,当我们提到值时,指的是一种特定类型的原语或引用,它们都具有值语义。如果某个对象在其交互中,只有值是重要的,而不是其标识,那么该对象就具有值语义。Java原语都有值语义:每个(数字)7都等于其他(数字)7。不过,对象不一定有值语义,特别是可变对象,它通常没有值语义。在后面的章节中,我们将研究值和对象更细微的区别,但是现在,我们暂且将值定义为一块不可变的数据,将定义了不可变数据的行为的类型称为值类型。

所以数字7是一个值,装箱后的Integer是一个值类型(因为装箱类型是不可变的),“banana”是一个值(因为字符串是不可变的),URI是一个值(因为URI是不可变的),但是java.util.Date不是一个值类型(因为可以调用setYear或其他方法更改日期)。不可变类型DBConnectionInfo的实例是值,但是Database类型的实例不是值,即便它所有的属性都是不可变的。这是因为它不是数据块,而是一种访问和修改数据块的方法。

JavaBean是值吗?UI组件型的JavaBean不是值,因为UI组件不仅仅是数据——两个完全相同的按钮可以有不同的身份标识。对用于表示简单数据的Bean来说,这取决于它们是否不可变。创建不可变的Bean是可能的,但大多数开发人员会更多地将其视为POJO。

POJO是值吗?这个术语是指那些不需要从框架类型进行扩展就能发挥作用的类。它们通常用于表示数据,并且其访问器方法符合JavaBean约定。很多POJO没有默认的构造函数,而是定义构造函数来初始化那些没有合理默认值的属性。正因为如此,不可变的POJO很常见,而且可能具有值语义。不过,可变的POJO似乎仍然是默认的,以至于很多人认为Java中的面向对象编程就是指的可变对象。可变POJO并不是值。

综上所述,Bean在技术上可以是一个值,但很少这样使用。POJO通常具有值语义,特别是在现代Java时代。虽然在这一章中,我们真正关注的是从可变对象到不可变数据的重构。 1dKa971mBtEBuhFUVqucw0U+yxcwllpGJ9Els2a5UQCDXkMbMTbPomCt6A7FZgqw

点击中间区域
呼出菜单
上一章
目录
下一章
×