11

在 Java 8 中,除了需要在具体类中实现的声明外,我们还可以对接口中的方法进行默认实现。

在接口中使用默认方法是一种好的设计还是最佳实践,还是 Java 8 提出这种方法只是为了对旧 API 提供更多支持?我们应该从在新的 Java 8 项目中使用默认方法开始吗?

请帮助我详细了解什么是好的设计。

4

3 回答 3

2

在 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)电话。那些不在乎的人不必修改他们的代码!

请注意:当然,这只适用于扩展接口。您不能使用这种方法来更改签名或删除现有接口中的方法。

因此:只需向接口添加一个方法;并默认在那里实现该方法;在不破坏任何现有客户端代码的情况下向前迈出了一大步

含义:为什么不在现有接口上使用默认方法?现有代码将不在乎。它不知道新的默认方法。

于 2016-09-05T12:28:08.273 回答
0

Interface 中的默认方法有一些限制。接口中不能有数据变量。通常,添加默认方法的原因如下。假设在您以前的版本中,您编写了一个实现接口“A”的类。在您的下一个版本中,您决定向接口“A”添加一个方法是个好主意。但是你不能这样做,因为现在任何实现“A”的类都不会有那个额外的方法,因此不会编译。这将是一个主要的向后兼容性故障。因此,在 Java 8 中,您可以将默认方法实现添加到接口中,这样所有实现旧版本“A”的类都不会被破坏,而是会退回到默认实现。因此,请谨慎使用此功能,仅当您确实需要扩展现有界面时。

于 2016-09-05T12:54:34.413 回答
-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…
    }
}

为什么选择默认方法? 重新设计现有的 JDK 框架总是非常复杂。在 JDK 框架中修改一个接口会破坏所有扩展该接口的类,这意味着添加任何新方法都可能破坏数百万行代码。因此,引入了默认方法作为一种机制,以向后兼容的方式扩展接口。

注意

但是,我们可以实现这种向后兼容性。但它始终建议使用带有声明的接口,这才是它们最适合的用途。

举个简单的例子,如果你有一个interface Human_behaviour你可以利用这个接口的所有动作,例如to_Walk(); to_Eat(),例如在每个实现类中,以每个人类对象的独特方式。就像to_Love()to_Fight()

一个人可以使用剑进行战斗,而另一个对象可以使用枪支等。因此,接口是一种祝福,但可以始终根据需要使用。

于 2016-09-05T12:17:03.533 回答