从Collection继承的类似Collection的接口

时间:2019-06-17 08:17:44

标签: java collections interface

我有一个类似集合的接口,其中包含Collection接口的大多数方法,但是存在一个与addcontains方法有关的问题,该问题仅涉及到从Collection继承。

T中类型为Collection的元素实现一种copy方法和一个setter,有时需要采用以下方式:

  • 在通过提供的setter插入元素之前对其进行更改
  • 创建元素的副本,通过提供的设置器更改一个或两个元素,然后再插入它们

可以通过考虑一个采用字符串参数的集合来形象地看到这一点,但是如果添加了特定的字符串foo,则截断的版本fofo加上另一个字符串{{ 1}}。

bar

问题在于,有时会插入多个元素,这与// Examples of the add() method internals collection.add("foo"); // internally add("fo"); collection.add("foo"); // internally add("fo"); add("bar"); 中的方法约定本身是好的,但是在插入之前更改元素有点脏。如果使用add方法并插入了元素,它将不再copy原始元素。

问题:不那么扩展contain是正确的吗?还是在这里重新定义大多数收集方法是更好的选择?

2 个答案:

答案 0 :(得分:2)

如果您的界面按照您的描述运行,则不应扩展Collection,因为它确实违反了Collection的{​​{1}}的约定,即:

  

确保此集合包含指定的元素

  

如果一个集合由于已经包含该元素以外的其他原因拒绝添加一个特定元素,则它必须引发一个异常(而不是返回false)。这样保留了不变,即在此调用返回之后,集合始终包含指定的元素。

如果add实际上添加了“ fo”,则该合同被破坏。

如果您的界面扩展了collection.add("foo");,则该界面的用户可以将您的界面的实例分配给Collection变量,并期望其行为与Collection界面中所述的一样。

答案 1 :(得分:1)

添加到@Eran的答案。

来自文档

If a collection refuses to add a particular element for any reason
other than that it already contains the element, it must throw
an exception (rather than returning false)

不要使用add方法。相反,您可以扩展Collection并添加遵循合同的新方法。

boolean addOrSplit(E e) {
    if(contains(e)) {
         //split e
         //addOrSplit(e - Part1);
         //addOrSplit(e - Part2);
    } else {
         add(e);
    }
}

请确保您处理了递归结束条件,并在此实现中避免了无限循环。