gpt4 book ai didi

Java 接口(interface) : Use default method implementation in implementation classes

转载 作者:行者123 更新时间:2023-12-04 01:07:56 28 4
gpt4 key购买 nike

我有一个接口(interface)及其 2 个或更多实现,

public interface IProcessor {
default void method1() {
//logic
}
default void method2() {
//logic
}
public void method3();
public void method4();
}

这里,method1method2 实现逻辑在所有多个实现类中是通用的。所以定义为默认方法。所以只有其余的方法可以在实现类中被覆盖。

public CarImpl implements IProcessor {
@Override
public void method3() {
//logic
}
@Override
public void method4() {
//logic
}
}

public VanImpl implements IProcessor {
@Override
public void method3() {
//logic
}
@Override
public void method4() {
//logic
}
}

是否有更好的方法可以在没有默认方法和各自的实现类中没有冗余代码的情况下实现这一目标?因为如果 default 方法中的代码增加,那么 interface 看起来很笨拙。

最佳答案

可以覆盖默认方法

你说:

So only the rest of the methods can be overridden in the implementation classes.

那里的“只”字不正确。接口(interface)中的默认方法确实可以被实现类覆盖。因此,default 一词用作此处的关键字,意思是:如果运行时没有其他实现代码,则使用此方法代码。

这是一个愚蠢的人为设计的例子,我们定义了一个接口(interface) Fruit 和一个返回 true 的默认方法 isJuicy。我们有两个子类,OrangeBanana。第一个没有覆盖 isJuicy,因此它的行为来自默认方法。第二个演示您可以覆盖默认方法。在这里我们看到覆盖返回 false

package work.basil.example;

public class OverridingDefault
{
public static void main ( String[] args )
{
OverridingDefault app = new OverridingDefault();
app.demo();
}

private void demo ( )
{
System.out.println( "new Orange().isJuicy(): " + new Orange().isJuicy() );
System.out.println( "new Banana().isJuicy(): " + new Banana().isJuicy() );
}

public interface Fruit
{
default boolean isJuicy ( )
{
return true;
}
}

public class Orange implements Fruit
{
}

public class Banana implements Fruit
{
@Override
public boolean isJuicy ( )
{
return false;
}
}
}

运行时。

new Orange().isJuicy(): true
new Banana().isJuicy(): false

优先使用抽象类而不是默认方法

你问:

Is there a better approach that I can achieve this without default methods and without redundant code in the respective implementation classes?

我确实建议您不要为此使用默认接口(interface)方法。

向 Java 接口(interface)添加默认方法的想法和技术本身并不是一项功能,而是作为另一个问题的解决方案:在现有接口(interface)上改进功能以支持新的 lambda 功能,但又不破坏数百万 Java 的现有代码程序员,就像在以其他方式向现有接口(interface)添加方法时会发生的那样。通过在接口(interface)上发明 default 方法,Java 团队能够向现有接口(interface)添加更多方法,同时减轻所有现有实现对实现这些新方法的需求。无需破坏代码的新功能,这是 Java 的标志。

State of the Lambda by Brian Goetz 2013-09 中所述:

The purpose of default methods (…) is to enable interfaces to be evolved in a compatible manner after their initial publication.

我个人的观点是,程序员通常不会期望将行为内置到您的界面中。 Java 中接口(interface)的经典用法是根据 method signatures 定义契约。 ,不定义行为(代码)。因此,仅在万不得已时才考虑将添加行为(代码)添加为默认方法。

相反,将您的接口(interface)定义为没有默认方法的契约(Contract)。至少一开始没有默认方法;稍后您可能会像 Brian Goetz 和 Java 团队一样发现需要添加默认方法。但仅从契约(Contract)开始。

然后定义一个实现该接口(interface)的抽象类。任何要在各个子类之间共享的行为(代码)都可以移到这个抽象类中。

然后继续定义从抽象类继承的子类、具体类。

通过接口(interface) + 抽象类 + 具体类的这种经典且通用的方法,您可以灵活地进行更改,并使测试更容易(使用 stub 而不是真实的类),同时从一个地方有效地共享代码,但允许覆盖其中的代码需要。

关于Java 接口(interface) : Use default method implementation in implementation classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65700227/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com