正如我们在第1章中所讨论的那样,引入JavaBean是为了允许开发类似Visual Basic风格的拖放式GUI构建器。开发人员可以将一个按钮放置在表单上,更改其标题和图标,然后连接到onclick处理器。在幕后,GUI构建器将编写代码来实例化按钮对象,然后调用已更改属性调的setter方法。为了定义JavaBean,类需要一个默认(无参数)的构造函数、其属性的getter方法以及可变属性的setter方法(我们将忽略Serializable的要求,因为即使是Sun公司也从未认真考虑过这个问题)。这对于有很多属性的对象来说是有意义的。GUI组件通常有前景色、背景色、字体、标签、边框、大小、对齐方式、边距等属性。在大多数情况下,这些属性的默认值都没有问题,因此,仅为特殊的属性调用setter方法可以最大限度地减少生成的代码量。即便在今天,可变组件模型仍然是GUI工具包的可靠选择。
然而,当JavaBean被引入时,我们认为大多数对象都是可变的,而不仅仅是UI组件。毕竟对象的意义在于封装属性和管理它们之间的关系。这样设计的目的是解决一些问题,比如当一个组件的边界发生变化时更新其宽度,或者在添加商品时更新购物车的总价。对象是用来管理可变状态的解决方案。拥有不可变的String类对于当时的Java来说是相当激进的(尽管它还是忍不住仍旧使用可变的Date)。
如今,作为专业人士,我们对此有更深层的理解。我们意识到可以使用对象来表示不同类型的事物——值、实体、服务、操作、事务等。然而,Java对象的默认模式仍然是JavaBean,这是一个可变对象,其属性具有getter和setter。尽管它可能适合于UI工具包,但这并不是一个好的默认模式。对于大多数我们想用对象来表示的事物来说,值类型会更加合适。