Java 接口API总是常量吗?
例如Java 接口API总是常量吗?,java,interface,Java,Interface,例如java.util.Set,是否保证一致性?“一致”意味着作者永远不会添加、删除或修改当前的接口方法。所以我的类实现了它,它总是可以工作的 事实上,当我使用“组合”而不是“继承”时,我正在考虑风险。(生效Java第16项)一旦SetAPI发生变化,代码将被破坏 接口API总是常量吗 我假设您正在询问是否可以以不兼容的方式更改SetAPI 真正能够保证这一点的只有甲骨文 我没有看到Oracle的任何保证(书面),但根据过去的历史,他们以影响用户代码二进制兼容性的方式修改SetAPI的可能性为零
java.util.Set
,是否保证一致性?“一致”意味着作者永远不会添加、删除或修改当前的接口方法。所以我的类实现了它,它总是可以工作的
事实上,当我使用“组合”而不是“继承”时,我正在考虑风险。(生效Java第16项)一旦Set
API发生变化,代码将被破坏
接口API总是常量吗
我假设您正在询问是否可以以不兼容的方式更改Set
API
真正能够保证这一点的只有甲骨文
我没有看到Oracle的任何保证(书面),但根据过去的历史,他们以影响用户代码二进制兼容性的方式修改Set
API的可能性为零
简言之:别担心。当然,对于Java SE中的任何标准接口1
1-内部接口是一个不同的问题;e、 g.应用程序中的任何API
sun.*
包树。然而,若你们使用它们,那个就是你们正在服用的药物之一。当心
接口API总是常量吗
我假设您正在询问是否可以以不兼容的方式更改Set
API
真正能够保证这一点的只有甲骨文
我没有看到Oracle的任何保证(书面),但根据过去的历史,他们以影响用户代码二进制兼容性的方式修改Set
API的可能性为零
简言之:别担心。当然,对于Java SE中的任何标准接口1
1-内部接口是一个不同的问题;e、 g.应用程序中的任何API
sun.*
包树。然而,若你们使用它们,那个就是你们正在服用的药物之一。当心 我不会担心的。甲骨文是一家企业。如果他们对其中一个常见的API进行了更改,导致大量程序停止工作,这对他们来说将是一个巨大的黑眼,并损害他们的品牌。他们不会那样做的
如果他们确实计划进行不兼容的更改,我相信他们会首先将计划在未来版本中删除的任何方法标记为“已弃用”。还有一个@弃用的注释,它将导致编译器和IDE生成警告。这应该会给FeatureFair的用户一个警告,他们最终需要进行更改。我不知道用户通常需要多长时间才能做出更改,但在我看来,一些Java特性在几个版本中被标记为不推荐使用。(例外:原始泛型类型被记录为可能消失的东西。因此,如果您将对象声明为集
,而不是集
或集
,则可能会在未来的Java版本中中断。)
警告:这仅适用于API中记录的属性。特别是在Set
的情况下,文档中说,如果您迭代一个集合(例如,for(element:mySet)
),则顺序是未定义的,除非实际集合是一个表示已定义顺序的实现。特别是,对于哈希集
,它将是未定义的。这意味着,如果您有意或无意地编写代码,并且只有在结果以特定顺序出现时才有效,那么您的代码可能会在下一版本中中断
编辑:关于是否可以将方法添加到接口:请注意,添加方法不会破坏使用已提供的对象作为接口实例的普通代码,但它可能会破坏实现接口的代码。对于主要为用户代码实现而提供的接口(例如,Runnable
,函数接口),添加方法(而不是default
方法)可能会破坏大量代码,因此我认为他们会出于同样的原因避免添加方法。(如果他们想添加一个方法,他们可以定义一个新的子接口。)对于像Set
这样的集合类,这就不那么清楚了,因为代码使用Java已经提供的实现之一更正常;开发自己的实现似乎相当少见。尽管如此,与我的第一个版本的答案相反,我无法找到任何情况,其中一个接口添加了非默认方法。我不担心它。甲骨文是一家企业。如果他们对其中一个常见的API进行了更改,导致大量程序停止工作,这对他们来说将是一个巨大的黑眼,并损害他们的品牌。他们不会那样做的
如果他们确实计划进行不兼容的更改,我相信他们会首先将计划在未来版本中删除的任何方法标记为“已弃用”。还有一个@弃用的注释,它将导致编译器和IDE生成警告。这应该会给FeatureFair的用户一个警告,他们最终需要进行更改。我不知道用户通常需要多长时间才能做出更改,但在我看来,一些Java特性在几个版本中被标记为不推荐使用。(例外:原始泛型类型被记录为可能消失的东西。因此,如果您将对象声明为集
,而不是集
或集
,则可能会在未来的Java版本中中断。)
警告:这仅适用于API中记录的属性。特别是在Set
的情况下,文档中说,如果您迭代一个集合(例如,for(element:mySet)
),则顺序是未定义的,除非实际集合是一个表示已定义顺序的实现。特别是,对于哈希集
,它将是未定义的。这意味着,如果您有意或无意地编写代码,那么