在Java 8中,除了需要在具体类中实现的声明外,我们还可以为接口中的方法提供默认实现。
在界面中使用默认方法是一个好的设计还是最佳实践,或者Java 8是否只是为了在旧的API上提供更多支持?我们应该从新的Java 8项目中使用默认方法开始吗?
请帮助我详细了解这里的优秀设计。
答案 0 :(得分:2)
在java8之前,当你谈到扩展接口的“合理”方式时,你正在寻找versioned capabilities:
你有类似的东西:
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)
电话。那些不在乎的人不必修改他们的代码!
请注意:当然,这仅适用于扩展接口。您既不能使用此方法来更改签名,也不能在现有界面中删除方法。
因此:只需在界面中添加 new 方法;并且默认在那里实现该方法;在不破坏任何现有客户端代码的情况下,巨大向前迈进一步!
含义:为什么不在现有接口上使用默认方法? 现有代码无关紧要。它不知道新的默认方法。
答案 1 :(得分:0)
Interface中的默认方法有一些限制。您不能在Interface中拥有数据变量。通常,由于以下原因添加了默认方法的原因。在你以前的版本中说你写了一个实现接口“A”的类。在你的下一个版本中,你决定在你的接口“A”中添加一个方法是个好主意。但是你不能这样做,因为任何实现“A”的类现在都没有那个额外的方法,因此不会编译。这将是一个主要的向后兼容性细分。因此,在Java 8中,您可以在接口中添加默认方法实现,这样实现旧版本“A”的所有类都不会被破坏,但会回退到默认实现。因此,只有在确实需要扩展现有界面时才能谨慎使用此功能。
答案 2 :(得分:-1)
在早期的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…
}
}
为什么选择Defaut方法? 重新设计现有的JDK框架总是非常复杂。修改JDK框架中的一个接口会破坏扩展接口的所有类,这意味着添加任何新方法都可能会破坏数百万行代码。因此,引入了默认方法作为以向后兼容的方式扩展接口的机制。
注意强>:
但是我们可以实现这种向后兼容性。但是我们总是建议将接口与只有它们最适合使用的delarations一起使用。
对于简单示例,如果您有interface Human_behaviour
,则可以使用此界面的所有操作,例如to_Walk();
to_Eat()
,to_Love()
,to_Fight()
以每种人类对象的独特方式在每个实施类中说 .Like
一个人可以使用枪和其他物体使用枪支等进行战斗。 因此,界面是一种祝福,但可以随时根据需要使用。