在Java 8中,接口可以包含已实现的方法,静态方法和所谓的“默认”方法(实现类不需要重写)。
以我的观点(可能是幼稚的),不需要违反这样的接口。接口一直是您必须履行的合同,这是一个非常简单而纯粹的概念。现在,它是几件事情的混合体。在我看来:
- 静态方法不属于接口。它们属于实用程序类。
- 根本不应该在接口中允许使用“默认”方法。为此,您可以始终使用抽象类。
简而言之:
在Java 8之前:
- 您可以使用抽象和常规类来提供静态和默认方法。接口的作用很明显。
- 接口中的所有方法都应通过实现类来覆盖。
- 您不能在不修改所有实现的情况下在接口中添加新方法,但这实际上是一件好事。
在Java 8之后:
- 接口和抽象类之间几乎没有区别(除了多重继承)。实际上,您可以使用接口模拟常规类。
- 在对实现进行编程时,程序员可能会忘记覆盖默认方法。
- 如果类试图实现两个或多个具有默认方法且具有相同签名的接口,则会出现编译错误。
- 通过向接口添加默认方法,每个实现类都会自动继承此行为。这些类中的某些类可能并未在设计时考虑到该新功能,因此可能会引起问题。例如,如果有人将新的默认方法添加
default void foo()
到interfaceIx
,则不会编译Cx
实现Ix
并具有具有foo
相同签名的私有方法的类。
进行此类重大更改的主要原因是什么?它们会带来哪些新的好处(如果有)?
@Deprecated
类别!由于无知和懒惰,静态方法是Java中使用最广泛的构造之一。许多静态方法通常意味着程序员能力不足,将耦合提高了几个数量级,并且当您意识到它们为什么是个坏主意时,对于单元测试和重构是一场噩梦!