Java中的最终接口?

Jav*_*ser 31 java oop

可以在Java中将接口声明为final吗?

Igo*_*aka 22

接口是100%抽象的,创建接口实例的唯一方法是实例化实现它的类.允许接口final完全没有意义.

编辑这些问题并不像我最初想的那样完全令人愤慨.最终接口是一个不能被其他接口扩展但可以在表面上实现的接口.

我可以想到最终类和最终接口之间的一个区别.扩展类可能会损害其完整性,因为它包含某些状态.扩展接口只会增加操作,并且不会损害实现的完整性,因为接口本身是无状态的.

  • 你的句子并不相互跟随.最终将阻止扩展,而不是实施.有一些接口,如Clonable和RandomAccess,其他接口很少扩展,但通常是实现的.至于明确阻止任何接口扩展接口是否毫无意义,这是一个不同的观点. (8认同)

Jor*_*wis 15

否.尝试在Java中将接口声明为final会导致编译错误.这是一种语言设计决策 - Java接口是可扩展的.


aio*_*obe 11

不,Java语言规范部分9.1.1.接口修饰符声明如下:

接口声明可以包括接口修饰符.

InterfaceModifier:
  (one of)
  Annotation public protected private
  abstract static strictfp
Run Code Online (Sandbox Code Playgroud)

可以看出,该列表不包括final.

为什么语言是这样设计的?

如果声明了一个接口,final我想它可能就是这个意思

  • 没有其他接口可以扩展它

    这将是一种非感性限制.为什么声明一个 final 是有用的原因是保护状态不变量,禁止一次覆盖所有方法等等.这些限制都不适用于接口.(没有状态,必须覆盖所有方法.)

  • 没有类可以实现该接口

    这显然完全违背了界面的目的.

  • 就其价值而言,我正在从事的一个项目包含一个接口,该接口只不过是要在其他类中使用的静态常量的集合。我不能说这是否是糟糕的设计(事实上,它的存在是为了帮助我们避开 SonarQube 的“无魔法数字”规则而不真正修复它,这一事实看起来更值得怀疑,另一方面)。 (2认同)

bak*_*kal 8

从Java语言规范(第三版):

9.1.1.1抽象接口

每个接口都是隐含的 abstract.此修饰符已过时,不应在新程序中使用.

所以,abstract+ final有点像矛盾.