为公共API公开Collection或Set

时间:2015-02-18 17:15:54

标签: java collections set public

据说对接口而不是特定类型进行编码是一种很好的做法。换句话说,我们在创建API时公开通用接口而不是特定的实现。

例如:

public Collection<Model> getUniqueModels();
public void setUniqueModels(Collection<Model> modelCollection);

但我的问题是,如果我希望消费者知道我只会返回一组独特的模型,即所有模型都会有所不同。

public Set<Model> getUniqueModels();
public void setUniqueModels(Set<Models> modelSet);

这是创建publc API的坏方法吗?如果我使用集合一并且消费者发送一个不起作用的重复模型列表怎么办?

3 个答案:

答案 0 :(得分:4)

设计&#34;宽松&#34;的好方法公共API是为了使类型与您返回的内容一样具体,并尽可能宽容您接受的内容。

在这种特殊情况下,您应该返回Set<Model>并接受Collection<Model>,并了解任何重复内容都会被忽略:

public Set<Model> getUniqueModels();
public void setUniqueModels(Collection<Model> modelSet);

甚至

public void setUniqueModels(Collection<? extends Model> modelSet);

这样的API会告诉用户他们不会从getter获取模型中的任何重复项,但是如果API的用户更喜欢验证其他类型的唯一性,它会接受setter中其他类型的集合。方式(例如,通过使用确保唯一性的查询从数据库中提取List<Model>。)

  

如果消费者在不知不觉中发送重复列表会怎么样?

有两种方法:你可以默默地忽略它,或者你可以验证并引发异常。

第一种方法(即忽略重复项)通常足够好:这就是Java API的工作方式,例如,从集合构造HashSet<T>时。而不是用户在整个地方制作独特的集合,你可以创建一个独特的集合,让他们传递重复的内容。

然而,即使是第二种方法也为用户提供了比接受Set<Model>更大的灵活性,因为它决定了使集合的独特性。

答案 1 :(得分:1)

使用Set接口仍然符合接口编程的原则。只要它定义了您打算使用的集合的语义,在这种情况下,集合中的所有元素都是唯一的,那么它没有任何问题。 CollectionSet都是接口,但后者使消费者理解没有重复。

答案 2 :(得分:1)

公开Set接口是可以接受的 - 毕竟这仍然是一个接口,而不是具体的类。公开特定的具体类(例如HashSet 是不好的做法,但你很好地暴露消费Set。我认为没有必要只公开最高级别的界面。