学习java 8默认方法。 这个link就像互联网上的任何其他资源一样
在“最严格的意义上”,默认方法是向后退一步因为 它们允许您使用代码“污染”您的接口。但是他们 提供最优雅和实用的方式允许倒退 兼容性。它使Oracle更容易更新所有内容 集合类,并为您改进现有代码 LAMBDA。
我的理解是java 8 dev / designer在接口中提供了默认方法,因此所有实现类都不必不必要 覆盖相同的行为,因此提供向后兼容性。例如: - 如果ForEach方法不是默认方法,则实现类的每个集合都必须实现它。同意。
为了克服这个问题,我们可以让一个类提供这些默认方法的实现,然后实现类似arraylist等的类 扩展了那个。通过这种方式,我们可以对java基本原理进行统计,即可重用性和抽象性,即保持界面污染较少
我确信java 8开发/设计师已经考虑过这个问题,因为他们学到的东西更多,我在这里缺少一些东西。有人可以帮助我们,这样我们的开发人员也可以作为这一重大变化的最佳人选吗?
答案 0 :(得分:7)
为了克服这个问题,我们可以让一个类提供这些默认方法的实现,然后实现类似arraylist等的类可以扩展它。
您的建议仅适用于标准JDK类(因为它们通常会扩展一些基类,如AbstractCollection
和AbstractList
,如果可以添加新方法的实现)。
实现JDK接口的自定义类怎么样?例如,如果您有一个实现List
但没有扩展某些JDK List
实现的类,那么您应该能够切换到Java 8而无需在您的类中实现新方法
在default
界面中List
实施新方法后,您无需触及自定义类。如果您对默认实现不满意,可以稍后为这些方法添加自定义实现。
答案 1 :(得分:4)
在Java 8之前,interfaces
只能有abstract methods
。必须在单独的类中提供这些方法的实现。因此,如果要在interface
中添加新方法,则必须在实现相同接口的类中提供其实现代码。
为了解决这个问题,Java 8引入了default methods
的概念,它允许接口使用实现方法,而不会影响实现interface
的类。
引入了default methods
以提供向后可比性,以便现有的interfaces
可以使用lambda表达式而无需实现实现类中的方法。 Default methods
也称为defender methods
或virtual extension methods
。
答案 2 :(得分:0)
如果需要向接口添加新方法,则使用现有接口的客户端将被破坏,因为类需要实现接口中的所有方法。
在这种情况下,可以使用default and static methods。这些方法可以有主体,客户端不需要实现它们,因此现有的实现无需任何更改即可工作。
例如,如果要增强接口以添加接受lambda表达式的方法,可以使用默认方法。