java - 从 Collection 继承的类 Collection 接口
问题描述
我有一个类似集合的接口,其中包含接口的大多数方法Collection
,但是有一个与我关心的add
与方法相关的问题,即简单地继承自.contains
Collection
T
类型中的元素Collection
实现了一个copy
方法和一个 setter,有时需要以下方式:
- 在通过提供的 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
的,还是重新定义大多数收集方法是一个更好的选择?
解决方案
如果它的行为与您描述的一样,则您的界面不应扩展Collection
,因为它确实违反了Collection
's的合同,该合同add
说:
确保此集合包含指定元素
和
如果一个集合拒绝添加一个特定元素,除了它已经包含该元素之外,它必须抛出一个异常(而不是返回 false)。这保留了在此调用返回后集合始终包含指定元素的不变量。
如果collection.add("foo");
实际上添加了“fo”,那么合同就被打破了。
如果您的接口 extends Collection
,您接口的用户可以将您的接口实例分配给一个Collection
变量,并期望它的行为与Collection
接口中描述的一样。
推荐阅读
- c - fscanf 在 C 中返回可疑数据
- javascript - 查找 div 然后返回到特定的 div (jQuery)
- python - 如何杀死异步协程(不是 First_completed 案例)
- docker - 无法从容器默认路由 172.17.0.1 内部 ping
- java - Retrofit and Volley——同步和异步请求
- java - 拆分 toString 的返回值的值
- php - 左连接多态关系 Laravel
- typescript - 在带有类的 TS 中使用开放式参数
- python - Round To 1dp 给出错误的数字
- android - Flutter 应用程序无法运行,显示 Gradle 任务 assemble Debug failed with exit code -1