据说针对接口(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/