在接口中受保护

新手上路,请多包涵

为什么 interface 定义中的所有方法都隐含 public ?为什么它不允许 protected 方法?

原文由 Swaranga Sarma 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 345
2 个回答

因为接口应该意味着“你可以从课堂外看到什么”。添加非公共方法没有意义。

原文由 Raveline 发布,翻译遵循 CC BY-SA 2.5 许可协议

尽管经常被引用的原因是“接口定义了公共 API”,但我认为这是过于简单化了。 (而且它也“闻起来”有循环逻辑的味道。)

混合使用访问修饰符的接口并不是没有意义的;例如,部分公开,部分限制在与接口相同的包中的其他类。事实上,在某些情况下,这可能非常有用,IMO。

实际上,我认为使接口成员隐式公开的部分 原因 是 _它使 Java 语言更简单_:

  • 隐式公共接口成员对程序员来说更容易处理。您见过多少次看似随机选择方法访问修饰符的代码(类)?许多“普通”程序员很难理解如何最好地管理 Java 抽象边界1 。将 public/protected/package-private 添加到接口中会使它们变得更加困难。

  • 隐式公共接口成员简化了语言规范……因此简化了 Java 编译器编写者和实现反射 API 的人员的任务。

“接口定义公共 API”的思路可以说是简化语言设计决策的结果(或特征)……而不是相反。但实际上,这两条思路可能在 Java 设计者的头脑中并行发展。

无论如何,官方对 JDK-8179193 中 RFE 的回应清楚地表明,Java 设计团队决定2允许接口上的 protected 增加了复杂性,几乎没有真正的好处。感谢@skomisa 找到证据

RFE 中的证据解决了这个问题。这就是为什么没有添加的官方原因。


1 - 当然,顶级程序员对这些事情没有困难,并且可能欢迎更丰富的访问控制功能。但是,当他们的代码交给别人维护时会发生什么?

2 - 您可能不同意他们的决定或他们陈述的推理,但这没有实际意义。

原文由 Stephen C 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题