到目前为止,我们讲述了如何创建一个类,以及如何根据类创建一个对象。类是Java程序的基础。类的创建,实际是程序员对所要模拟的对象的抽象。我们同样提到,根据抽象所采集的特性的不同,所分析出的类也是不同的。那么,在一个应用系统中,我们依据什么样的标准来抽象出类呢?本小节将利用咖啡杯选型的例子来进一步阐述类的选型过程。

对应于咖啡屋中的咖啡杯,我们可以尝试选择以下几种原型作为类:

1.选择“杯子”作为类

杯子是一个较大的概念。根据用途分:杯子中可能有茶杯、酒杯、咖啡杯等等。如果我们需要在Java中创建一个“咖啡杯”,而使用了“杯子”作为创建模型,那么就必须为其维护“杯子用途”这一属性(类的属性用于描述类的特性,我们将在第三章详细讲述类的属性),用以与其他杯子进行区分。很明显,创建一个“杯子”类,而实际需求为“咖啡杯”会增加我们的维护成本。因为当我们抽象出“杯子”这个概念时,只会考虑区别于其他器皿的(例如形状,盘子的形状为扁平)的特性,这使得我们不得不维护杯子用途这一特性。

class Cup {
    String cupUsage; //用于标识杯子用途,例如,咖啡杯、酒杯。。。
}

一般说来,咖啡屋中只有咖啡杯便已足够,因此,选择“杯子”作为类,范围过大,而且没有必要。

2.选择“咖啡杯”作为类

咖啡杯有很多种,例如按材质分,就有瓷质、陶质、不锈钢和骨瓷。如果咖啡屋中的咖啡杯有瓷质、陶质、骨瓷,那么我们就应当将“咖啡杯”选为模型(抽象为类),区分不同的对象,只需一个额外属性材质即可。

为了获得某种具体材质的咖啡杯,如“骨瓷咖啡杯”,而将“咖啡杯”作为类的选型,其代码如下所示:

class CoffeeCup {
    String cupMaterial;  //用于标识杯子材质,例如,瓷质、陶质、不锈钢、骨瓷等等。
}

其中,cupMaterial是类的属性,用于标识杯子的材质。首先创建一个CoffeeCup对象实例,然后为cupMaterial赋值“骨瓷”,就能真正创建一个骨瓷咖啡杯。

3.选择“骨瓷咖啡杯”作为类

如果咖啡屋中只有“骨瓷咖啡杯”,那么选择“骨瓷咖啡杯”作为类,是完全符合要求的。但是,大多数的情况下,咖啡屋不可能只有一种材质的咖啡杯,那么,单单拥有“骨瓷咖啡杯”类,便不能满足完整的需求。

我们通过上面的简单实例可以看出,利用“杯子”和“咖啡杯”作为类的,都是正确的设计,唯一的区别在于,具体到咖啡屋这个环境中,“咖啡杯”比杯子更加适宜。而单单利用“骨瓷咖啡杯“作为类,可能不能满足大多数咖啡屋的需求。因此,设计一个类,首先要对涉及的对象进行评估,确定范围,然后再决定抽象到哪个层次。