为什么API中有一套java.util?

时间:2013-08-05 02:22:29

标签: java api collections

java.lang.util 中的界面设置具有完全相同的结构 作为同一个包的集合

在继承层次结构中, AbstractSet 是 分别为设置 AbstractCollection 其中包括集合

Set的另一个直接后代是 SortedSet SortedSet 仅扩展设置

我想知道的是, java.lang.util 设置的收益是什么? - 为什么会出现?

如果我没有遗漏任何东西,那就不会添加任何东西 到API的当前结构或层次结构。 如果 AbstractSet 没有,那么全部都是一样的 实现Set但只是扩展 AbstractCollection SortedSet 直接扩展收藏

我唯一能想到的是设置是出于文档目的。

不应该用于进一步构建/重新构建层次结构 - 这意味着 后代的结构修改并没有意义。

如果我在这里遗漏了什么,我正在寻找验证或反驳。

// ===========================================

编辑:Q是:“为什么设置在那里” - 它是什么增加了API的结构?“

明显如何在数学集合中特别设置集合。

4 个答案:

答案 0 :(得分:8)

SetCollection中的方法具有相同的签名和返回类型,但它们具有不同的行为合同...源于一个集合不能包含的事实不止一次“相同”的元素。这就是为什么它们是不同的界面。

这不仅仅是文档。由于Java不执行“duck typing”,因此CollectionSet之间的区别在编译时和运行时类型检查中都是可见的。

这种区别是有用的。如果只有Collection,那么您将无法编写需要一个没有重复项作为参数的集合的方法。


你写道:

  

Set是除了评论之外的Collection的复制/粘贴。

我知道。评论是行为合同。他们很关键。没有其他方法可以在Java 1,2 中指定行为的内容。

参考:


1 - 在一种或两种语言中,您可以在语言本身中指定“合同”的行为方面。埃菲尔是典型的例子......它产生了“按合同设计”范式。

2 - 实际上,JML系统为Java添加了正式的前置条件,后置条件和不变量,并使用自动定理证明器对它们进行检查。问题是很难将它与Java语言的类型系统/静态类型检查器完全集成。 (当定理证明者说“我不知道”时,你如何静态地检查一些东西...因为它不够智能来证明/反驳代码中的JML断言?)

答案 1 :(得分:4)

一个集合不能包含重复元素。集合可以。

答案 2 :(得分:0)

SetCollection,不包含任何重复项。有关该页面的更多信息:

  

更正式地说,套装不包含任何一对   元素e1和e2使得e1.equals(e2),并且至多为1   元件。正如其名称所暗示的那样,该界面对其进行建模   数学集抽象。

     

除了那些之外,Set界面还有其他规定   继承自Collection接口,在所有合同上   构造函数和add,equals和hashCode的契约   方法。还包括其他继承方法的声明   这里是为了方便。 (随附的规格   声明已经针对Set接口进行了定制,但它们没有   包含任何其他规定。)

     

对于建造者的额外规定,这并不奇怪   所有构造函数都必须创建一个不包含重复元素的集合   (如上所述)。

如果Set不存在,则无法在Collection中强制执行唯一性。代码与Collection相同并不重要,Set存在以强制执行行为限制,因为由于定义的行为,当Setimplemented时,实施课程必须遵守其行为合同。

答案 3 :(得分:0)

  

java.lang.util中Set的收益是什么 - 为什么会出现?

将集合与其他集合分开可让您编写代码,以便只传入一个集合。这是一个有用的示例:

public void sendMessageTo(Collection<String> addresses) {
    addresses.add("admin@example.com"); //The admin might now be on the list twice, and gets two emails, oops :(
    //do something
}

我想将界面更改为Set:

public void sendMessageTo(Set<String> addresses) {
    addresses.add("admin@example.com"); //This will add the admin if they were not already on the list, otherwise it won't because Sets don't allow duplicates
    //do something
}