当前位置: 首页 > 科技观察

Java8中的默认方法和多重继承简介

时间:2023-03-11 23:08:02 科技观察

我一看到Java8发布,就决定开始深入研究编程语言的新增强功能。我承认,我没有像7那样关注这个版本,所以我知道的唯一增强是lambda表达式。在我通读文档并编写了一些示例程序以确保我对这些新功能有很好的理解之后,有一个功能特别引起了我的注意:默认方法。首先,让我们看看它们是什么。什么。先认识一下。本质上,默认方法是在接口中有实现的方法。传统接口仅由抽象方法、公共静态变量和最终变量组成。然后考虑以下内容:publicinterfaceExampleInterface{publicvoidexampleMethod();defaultpublicvoidexampleDefaultMethod(){//Someimplementationcodehere}}如果一个类决定实现ExampleInterface,它只需要实现exampleMethod,它可以简单地使用exampleDefaultMethod的默认实现。现在,让我们看看Oracle打算如何使用它们。应该如何使用它们的想法并不是让您在设计时将默认方法作为解决方案,而是事后才想到的。在Oracle的跟踪器中,他们声明的意图是“确保为那些旧接口编写的代码的二进制兼容性”(1)。本质上,您和您的开发人员编写了某个接口的多个实现,但您想添加一个新的东西。然而,这样做意味着重建所有那些实现该接口的类都将失败,除非您将新的实现片段添加到它们中的每一个。默认方法的想法是,你可以在不改变现有实现的情况下向接口添加新的需求,并且永远不必再次更改它们。但是,让我们退后一步考虑一下。这里仍然存在一些问题。首先,让我们接受这样一个事实,即有时会发生高级更改(例如更改界面)。但是,我们也不要忘记界面的用途。理想情况下,接口锁定一些高级对象,或者您正在创建API的一些特殊功能部分。如果一些类只需要实现接口的部分功能,而不是全部,那不是一个很好的设计吗?这不就是设计抽象类的原因吗?要求。现在值得庆幸的是,如果您有两个接口和单个方法签名的默认实现,并且您尝试拥有一个实现这两个接口的类,Java将拒绝编译该类。许多人抱怨在接口中允许公共静态变量的歧义,说在两个接口中具有相同的变量会有些歧义(因此像C#这样的编程语言禁止这样的事情),这有点难以处理。我看到这个特性在这个问题上是如何工作的,在我看到它在实践中使用之前我不会在这里详细说明它,但我必须强调它让我感到紧张。话虽这么说,让我们更多地看看这个特性可能被用在哪里而不是它的目的。可能的误用前面我们谈到了引入多重继承的歧义,那么编译器不会捕捉到什么?什么会阻止我像以前那样使用抽象类(通常是一些抽象方法和一些实现)而只是使用接口而不是利用从多个接口继承的好处?这一点也不坏,但它本身会鼓励使用Java努力避免的复杂设计。在构建抽象类的框架中,有些情况下你实际上需要多重继承来解决你无法用单一继承类型解决的问题。总结总的来说,Java8仍然提供了很多很酷的新东西,其中一些似乎违背了Java早期的基础。是好是坏,时间会证明一切。如果您有任何建议,请随时分享。此外,无论何时您开始在项目中使用Java8,都可以随时分享您的成功或失败故事。可以通过瑞安。肯尼@coveros。联系我。参考资料1–http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html英文原文:Java8DefaultMethodsandMultipleInheritance翻译链接:http://www.oschina.net/translate/java-8-默认方法和多重继承