首页 > 解决方案 > 从 Collection 继承的类 Collection 接口

问题描述

我有一个类似集合的接口,其中包含接口的大多数方法Collection,但是有一个与我关心的add与方法相关的问题,即简单地继承自.containsCollection

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

可以通过考虑一个带有字符串参数的集合来可视化这一点,但是如果添加了特定的字符串foo,则会添加一个截断的版本fo,或者fo加上另一个字符串bar

// Examples of the add() method internals
collection.add("foo"); // internally add("fo");
collection.add("foo"); // internally add("fo"); add("bar");

问题是,有时会插入多个元素,这对于方法合同 from 本身来说很好add,但是在插入之前更改元素有点脏。如果使用该copy方法并插入元素,它将不再contain是原始元素。

问题:扩展非少是正确Collection的,还是重新定义大多数收集方法是一个更好的选择?

标签: javacollectionsinterface

解决方案


如果它的行为与您描述的一样,则您的界面不应扩展Collection,因为它确实违反了Collection's的合同,该合同add说:

确保此集合包含指定元素

如果一个集合拒绝添加一个特定元素,除了它已经包含该元素之外,它必须抛出一个异常(而不是返回 false)。这保留了在此调用返回后集合始终包含指定元素的不变量。

如果collection.add("foo");实际上添加了“fo”,那么合同就被打破了。

如果您的接口 extends Collection,您接口的用户可以将您的接口实例分配给一个Collection变量,并期望它的行为与Collection接口中描述的一样。


推荐阅读