在 Java 8 中,除了需要在具体类中实现的声明外,我们还可以对接口中的方法进行默认实现。
在接口中使用默认方法是一种好的设计还是最佳实践,还是 Java 8 提出这种方法只是为了对旧 API 提供更多支持?我们应该从在新的 Java 8 项目中使用默认方法开始吗?
请帮助我详细了解什么是好的设计。
在 Java 8 中,除了需要在具体类中实现的声明外,我们还可以对接口中的方法进行默认实现。
在接口中使用默认方法是一种好的设计还是最佳实践,还是 Java 8 提出这种方法只是为了对旧 API 提供更多支持?我们应该从在新的 Java 8 项目中使用默认方法开始吗?
请帮助我详细了解什么是好的设计。
在 java8 之前,您在谈论扩展接口的“合理”方式时正在寻找版本化功能:
你有类似的东西:
interface Capability ...
interface AppleDealer {
List<Apples> getApples();
}
为了检索 AppleDealer,有一些中央服务,例如
public <T> T getCapability (Class<T> type);
因此,您的客户端代码将执行以下操作:
AppleDealer dealer = service.getCapability(AppleDealer.class);
当需要另一种方法时,您可以:
interface AppleDealerV2 extends AppleDealer { ...
想要 V2 的客户只需打个getCapability(AppleDealerV2.class)
电话。那些不在乎的人不必修改他们的代码!
请注意:当然,这只适用于扩展接口。您不能使用这种方法来更改签名或删除现有接口中的方法。
因此:只需向接口添加一个新方法;并默认在那里实现该方法;在不破坏任何现有客户端代码的情况下向前迈出了一大步!
含义:为什么不在现有接口上使用默认方法?现有代码将不在乎。它不知道新的默认方法。
Interface 中的默认方法有一些限制。接口中不能有数据变量。通常,添加默认方法的原因如下。假设在您以前的版本中,您编写了一个实现接口“A”的类。在您的下一个版本中,您决定向接口“A”添加一个方法是个好主意。但是你不能这样做,因为现在任何实现“A”的类都不会有那个额外的方法,因此不会编译。这将是一个主要的向后兼容性故障。因此,在 Java 8 中,您可以将默认方法实现添加到接口中,这样所有实现旧版本“A”的类都不会被破坏,而是会退回到默认实现。因此,请谨慎使用此功能,仅当您确实需要扩展现有界面时。
在早期的 Java 版本中,这是不可能的,因为您有抽象类只能使用具体和声明的方法,但是。Java 8 引入了“默认方法”或(Defender 方法)新特性,它允许开发人员向接口添加新方法,而不会破坏这些接口的现有实现。它提供了允许接口定义实现的灵活性,该实现将在具体类无法为该方法提供实现的情况下用作默认值。
让我们考虑一个小例子来了解它是如何工作的:
public interface oldInterface {
public void existingMethod();
default public void newDefaultMethod() {
System.out.println("New default method"
" is added in interface");
}
}
以下类将在 Java JDK 8 中成功编译
public class oldInterfaceImpl implements oldInterface {
public void existingMethod() {
// existing implementation is here…
}
}
为什么选择默认方法? 重新设计现有的 JDK 框架总是非常复杂。在 JDK 框架中修改一个接口会破坏所有扩展该接口的类,这意味着添加任何新方法都可能破坏数百万行代码。因此,引入了默认方法作为一种机制,以向后兼容的方式扩展接口。
注意:
但是,我们可以实现这种向后兼容性。但它始终建议使用带有声明的接口,这才是它们最适合的用途。
举个简单的例子,如果你有一个interface Human_behaviour
你可以利用这个接口的所有动作,例如to_Walk();
to_Eat()
,例如在每个实现类中,以每个人类对象的独特方式。就像to_Love()
to_Fight()
一个人可以使用剑进行战斗,而另一个对象可以使用枪支等。因此,接口是一种祝福,但可以始终根据需要使用。