Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接口API总是常量吗?_Java_Interface - Fatal编程技术网

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)
),则顺序是未定义的,除非实际集合是一个表示已定义顺序的实现。特别是,对于
哈希集
,它将是未定义的。这意味着,如果您有意或无意地编写代码,那么