Rav*_*ine 63
因为界面应该是"你可以从课外看到的东西".添加非公开方法是没有意义的.
Ste*_*n C 51
虽然经常被引用的原因是"接口定义公共API",但我认为这是一种过度简化.(它也"循环"了循环逻辑.)
嵌套接口可以是受保护的或私有的,如果是这种情况,它根本不定义公共接口.
拥有具有访问修饰符混合的接口并没有意义; 例如,部分公开,部分限制在与界面相同的包中的其他类.事实上,在某些情况下,这可能是非常有用的,IMO.
实际上,我认为使接口成员隐式公开的推理部分是它使Java变得更简单:
隐式公共接口成员对于程序员来说更容易处理.你有多少次见过代码访问修饰符的代码(类)看似随意?许多"普通"程序员很难理解如何最好地管理Java抽象边界1.将public/protected/package添加到接口会使它们变得更加困难.
隐式公共接口成员简化了语言规范......因此简化了Java编译器编写者以及实现Reflection API的人员的任务.
这种思路使"接口定义公共API"成为语言设计的结果(或特征)......而不是相反.实际上,这两种思路可能在Java设计者的脑海中并行发展.
1 - 当然,顶级程序员对这些事情没有任何困难,并且可能欢迎更丰富的访问控制功能.但是,当他们的代码被移交给其他人维护时会发生什么?
小智 20
我不得不说这个问题已经通过在Java 8中引入默认方法而重新打开了.我现在正在开发的项目,类似于接口的基本性质,意味着从实现中抽象出意图.
在某些情况下,我可以使用"默认保护"方法大幅简化我的代码.事实证明,这实际上并不起作用,因为接口仍然坚持Java 7逻辑.由于上述原因,正常受保护的方法没有任何意义; 但是如果一个默认的公共方法需要一个不太可能改变的低级资源并且可以由受保护的方法提供,那么在我看来,"默认保护"工作不仅可以保持更清晰的代码,还可以保护未来的用户免受意外滥用.
(这不幸地改变了我仍然需要使用其他不必要的摘要过度复杂化我的代码的事实;但我确实打算在Oracle中添加一个功能请求.)
Sea*_*oyd 10
因为接口定义了公共API.任何受保护的内容都是不属于接口的内部细节.
您可以将抽象类与受保护的抽象方法一起使用,但接口仅限于公共方法和公共静态最终字段.
sko*_*isa 10
这里的几个答案使用循环推理来解释为什么接口方法不能被保护:因为它们必须是公共的,所以显然它们不能被保护!
这没有任何解释,但幸运的是,几年前有人提出了对接口中受保护方法的增强请求作为 JDK 错误,这对这个问题有所了解:
接口中的受保护方法:跨包共享
由于修饰符在 Java 中受到一些限制,跨包共享方法的方法仅限于公共方法。有时将方法公开是危险的,但由于缺少适当的修饰符而需要公开。我的解决方案克服了这个限制。
Java 语言规范目前不允许对接口方法使用 protected 修饰符。我们可以利用这一事实,并为这个新功能的接口方法使用 protected。
如果接口方法被标记为受保护,并且该接口由另一个包中的类实现,则该方法不需要是公共的,但也可以是私有的或至少是包保护的。该方法是可见的,无论类声明它是什么,并且在接口的源包(和子包?)中也是可见的。
这样我们就可以在众所周知的包中共享某些方法。
这是对该增强请求的响应,该请求以 status 关闭Won't fix:
该提议试图以一种增加复杂性和特殊情况的方式来解决问题,而实际收益却很少。解决这个问题的典型方法是拥有一个实现公共接口的私有类。实现方法是公共的,但在私有类中,因此它们保持私有。
从 Java 9 开始,另一种可用的方法是将类和方法公开,但在具有限定导出到特定“朋友”模块而不是导出到公众的模块中。
因此,该错误报告的权威结论是:
protected方法。protected接口中的方法的理由是它“增加了复杂性和特殊情况,而实际收益很小”。也许,因为它是一个界面,即它告诉客户他们可以用实例做什么,而不是告诉他们他们不能做什么.
接口应被用作外部世界的“合同”。如果要使用受保护的方法,则最好使用抽象类(当然,如果Java中提供了抽象类)。 维基
另外,此帖子可能还会提供一些很好的答案:为什么我不能拥有受保护的接口成员?
我强烈认为接口应允许使用受保护的方法。谁说界面必须对全世界所有人可见?关于您的观点,这可能会使“普通”(不称职)程序员感到困惑:大量的OOP都是关于正确构造对象,类,程序包等的,如果程序员很难正确地完成所有这些工作,那么他有一个更大的问题。Java是为这种类型的东西而构建的。
| 归档时间: |
|
| 查看次数: |
42455 次 |
| 最近记录: |