【正确答案】这是一道要求读者掌握Java语言中的java.util.ArrayList和for...each循环的程序分析题。本题的解答思路如下。
仔细阅读Java程序7-1可知,类OrderList中具有一个类型为ArrayList的属性。结合图3-21订单管理系统的部分UML类图可知,类OrderList和Order之间具有聚集关系。由试题给出的关键信息“可以使用类java.util.ArrayList来实现对象的聚集关系”、“如果要使用for...each循环来遍历对象集合,那么包含该对象集合的类必须实现接口java.util.Iterable”可以推理出,(1)空缺处所填写的内容是“implements Iterable”。
在定义了ArrayList的类中,必须实现接口Iterator中的方法iterator::iterator(),因此(2)空缺处所填写的实现体应为:return this.orders.iterator(),或return orders.iterator()。
仔细阅读Java程序7-2可以初步判断,要填写(3)~(5)空缺处,首先要将方法statistic的功能及实现流程分析清楚。而且(3)~(5)空缺处所填写的内容与for...each循环的使用有关。使用for...each循环时,关键是要确定所遍历的是哪一个对象集合。在类SalesSystem中已经具有两个对象集合,即属性catalog和sales。
方法statistic的功能是依次统计产品目录中每个产品的订购总量,并打印出每个产品的编号、说明、订购总量和订购金额。若要统计产品目录中每个产品的订购总量,需要对3个对象集合进行遍历:产品目录(ProductList)、订单列表(OrderList)及Order(需要对订单中的所有订单项进行查询,统计每个订单上所订购的产品的数量)。由此可以得出实现该方法的基本流程是:从产品目录中取出一个产品→在订单目录依次查询每张订单→逐一查询某个订单中的所有订单项。
从产品目录中取出一个产品,这对应第1条for...each语句,此时被遍历的对象集合为ProductList。根据试题给出的for...each循环的语法—"for(用来接收集合中元素的变量:需要遍历的对象集合)”和(3)空缺处前半句的“Product product:”可以推断出,(3)空缺处应填写ProductList类的对象,而类 SalesSystem中的catalog就是ProductList的实例。并且结合图3-21的UML类图可知,类ProductList和 Product之间具有聚集关系。依照Java的程序设计规范,引用类的属性时,应使用“this.”属性名的形式。因此(3)空缺处的答案为this.catalog(或catalog)。
在订单目录依次查询每张订单,其对应于第2条for...each语句。根据第(3)空缺处的解题思路,可以确定出(4)空缺处应填写OrderList类的对象,即类SalesSystem的属性sales。因此(4)空缺处的答案为this.sales(或sales)。
逐一查询某个订单中的所有订单项,其对应于第3条for...each语句。由图3-21类图上可以看出,与类Order具有聚集关系的类是OrderItem。由此可以确定(5)空缺处应填写类OrderItem的对象。由于类SalesSystem中没有这种类型的属性,因此需要在这里定义一个临时对象。另外在if语句中出现了一个标识符item,但是在上下文中并没有出现对它的定义。由此可以推断item的定义应该在(5)空缺处提供。因此(5)空缺处的答案为OrderItem item。
【答案解析】