如java.util.Set<E>
,是否保证一致? &#34;一致&#34;表示作者永远不会添加,删除或修改当前的界面方法。所以我的课程实现它总能工作。
事实上,我正在考虑使用&#34;组合&#34;而不是&#34;继承&#34;。 ( Effective Java 第16项)一旦Set
API发生变化,代码就会崩溃。
答案 0 :(得分:3)
接口API是否始终保持不变?
我假设您在询问是否可以以不兼容的方式更改Set
API。
唯一能够真正保证是Oracle的人。
我没有看到来自Oracle的任何保证(以书面形式),但根据过去的历史记录,他们有可能以一种会影响用户代码二进制兼容性的方式改变Set
API。 / p>
简而言之:不用担心。当然,对于Java SE中的任何标准接口 1 。
1 - 内部接口是另一回事;例如中的任何API
sun.*
包树。但是,如果您使用他们,那就是您正在使用的risks之一。小心!
答案 1 :(得分:-1)
我不担心。 Oracle是一家企业。如果他们对其中一个常见的API进行了更改,导致大量程序停止工作,那将对他们造成很大的黑眼圈并损害他们的品牌。他们不打算这样做。
如果他们确实计划进行不兼容的更改,我相信他们会首先将他们计划在将来版本中删除的任何方法标记为“已弃用”。还有一个@Deprecated
注释,它将导致编译器和IDE生成警告。这应该为用户提供功能公平警告,他们最终需要进行更改。我不知道用户在必须进行更改之前通常需要多长时间,但在我看来,某些Java功能已被标记为已弃用多个版本。 (例外:原始泛型类型被记录为可能消失的内容。因此,如果您将对象声明为Set
,而不是Set<SomeType>
或{{1} },可能在未来的Java版本中中断。)
警告:这仅适用于API中记录的属性。特别是在Set<?>
的情况下,文档说如果迭代一个集合(例如Set
),则订单是未定义的,除非实际集合是一个表示订单已定义的实现。特别是,对于for (element : mySet)
,它将是未定义的。这意味着,如果您有意或无意地编写代码,只有在结果以特定顺序出现时才有效,您的代码可能会在下一个版本中中断。
编辑:关于方法是否可以添加到接口:请注意,添加方法不会破坏使用已提供的对象的正常代码接口,但它可能会破坏实现接口的代码。对于主要提供的接口,以便用户的代码可以实现它(例如HashSet
,功能接口),添加方法(Runnable
方法除外)可能会破坏大量代码,所以我假设他们会出于同样的原因避免添加方法。 (如果他们想要添加一个方法,他们可以定义一个新的子接口。)对于像default
这样的集合类,它有点不太清楚,因为代码使用Java已经提供的一个实现更为正常;开发自己的实现似乎相当罕见。但是,与我的第一个版本的答案相反,我无法找到任何将非默认方法添加到其中一个接口的情况。