java - 为公共(public) API 公开集合或集

标签 java collections set public

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

例如:

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

但我的问题是,如果我想让消费者知道我只会返回一组唯一的模型,即所有模型都会不同,该怎么办。

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

这是创建 publc API 的糟糕方法吗?如果我使用该系列,而消费者发送了一系列不起作用的重复模型,该怎么办?

最佳答案

设计“宽松”公共(public) API 的一个好方法是,对于返回的内容,类型尽可能具体,对于接受的内容,类型尽可能宽松。

在这种特殊情况下,您应该返回 Set<Model>并接受Collection<Model> ,但任何重复项都将被忽略:

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

甚至

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

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

what if the consumer sends a list of duplicates unknowingly?

有两种方法可以实现此目的:您可以默默地忽略它,或者您可以验证并引发异常。

第一种方法(即忽略重复项)通常足够好:这就是 Java API 的做法,例如,在构造 HashSet<T> 时来自一个集合。您不必让用户到处创建唯一的集合,而是可以创建一次唯一的集合,然后让他们将重复项传递给您。

但是,即使是第二种方法也为用户提供了比接受 Set<Model> 更大的灵 active 。 ,因为这让他们自己决定是否让该系列独一无二。

关于java - 为公共(public) API 公开集合或集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28589692/

相关文章:

java - 如何从 IIOMetadata 获取图像压缩质量?

java - Android Bitmap多线程处理——不是线程安全的?

java - 如何更改 Maven 登陆页面

c# - 如何创建这样的匿名类型 var c = List<string, string[]>()

java - 如何通过 java 的 ProcessBuilder 通过 ssh 将参数传递给 pkill?

java - 获取嵌套ArrayList的频率

java - 在哪里可以找到 Java 中的 Vector 和 Hashtable 文档?

c++ - 设置 union 不起作用

java - 互换 HashSet 和 TreeSet

Python:如何快速搜索集合中的子字符串?