在这一简短但重要的部分中,您将学到一些简单的准则,这些准则将使您的API与遵循这些准则的所有其他API无缝地互操作。本质上,这些规则定义了在集合世界要成为一个好的“公民”所需要的条件。

参量

如果您的API包含需要对输入进行收集的方法,那么将相关参数类型声明为集合接口类型之一就非常重要 。切勿使用 实现类型,因为这违反了基于接口的Collections Framework的目的,该目的是允许在不考虑实现细节的情况下操纵集合。
此外,您应始终使用有意义的最少特定类型。例如,如果需要Collection,则不需要ListSet。这并不是说您永远都不需要输入一个ListSet;如果方法取决于这些接口之一的属性,则这样做是正确的。例如,Java平台提供的许多算法在输入时都需要一个List,因为它们取决于列表是有序的。通常,输入中使用的最佳类型是最通用的:CollectionMap


警告: 切勿定义自己的临时collection类,并在输入时要求此类的对象。这样,您将失去Java Collections Framework提供的所有好处


返回值

与使用输入参数相比,使用返回值可以更加灵活。可以返回实现或扩展集合接口之一的任何类型的对象。这可以是接口之一,也可以是扩展或实现这些接口之一的专用类型。
例如,可以想象一个名为ImageList的图像处理程序包,该程序包返回实现List的新类的对象。除了List操作之外,ImageList还可以支持似乎需要的任何特定于应用程序的操作。例如,它可能提供indexImage操作,该操作返回一个包含ImageList中每个图形的缩略图的图像。需要特别注意的是,即使API在输出中提供ImageList实例,它也应在输入中接受任意Collection(或List)实例。
从某种意义上说,返回值应该具有与输入参数相反的行为:最好返回最特定的适用集合接口,而不是最通用的接口。 例如,如果您确定将始终返回SortedMap,则相关方法提供的返回类型应为SortedMap,而不是MapSortedMap实例的构建比普通Map实例更耗时,并且功能也更强大。鉴于您的模块已经投入时间来构建SortedMap,因此使用户能够使用其增强的功能非常有意义。此外,用户将能够将返回的对象传递给需要SortedMap的方法以及接受任何Map的方法。

旧版API

当前,有很多API定义了它们自己的临时集合类型。尽管这很不幸,但这是事实,因为Java平台的前两个主要版本中没有Collections Framework。假设您拥有这些API之一;这是您可以做的。
如果可能,请对旧式集合类型进行改造以实现标准集合接口之一。然后,您返回的所有集合将可以与其他基于集合的API顺利互操作。如果这是不可能的(例如,由于一个或多个先前存在的类型签名与标准集合接口冲突),请定义一个适配器类,该类包装您的一个传统集合对象,从而使其能够充当标准集合。(Adapter类是自定义实现的示例。)
如果可能,请使用遵循输入准则的新调用对API进行改进,以接受标准集合接口的对象。这样的调用可以与采用旧式收集类型的调用共存。如果这不可能,请为您的遗留类型提供构造函数或静态工厂,该构造函数或静态工厂将使用标准接口之一的对象并返回包含相同元素(或映射)的遗留集合。这两种方法均允许用户将任意集合传递到您的API中。