接口中的默认方法和私有方法

在本教程中,我们将研究接口内的默认方法和私有方法。 Java 8中添加了默认方法,从而允许将方法添加到具有默认实现的接口中,该默认实现可以被使用,覆盖或忽略,而不会引起实现该接口的现有类的问题。 添加默认方法时,缺少私有方法,以防止代码在接口内拆分为较小的方法。 这让我有些反感,好像您的默认方法过长了一样,根本无法整理它。 因此,既然接口中既可以使用默认方法,也可以使用私有方法,那么我们可以像以前那样编写方法,尽管如果您还没有使用默认方法,那么您首先需要克服的是现在存在实际代码的事实 在界面中。

就向接口添加默认方法和私有方法而言,这确实很简单。 要添加默认方法,只需添加关键字默认方法定义,我什至不告诉您如何添加私有方法,因为我不想侮辱您!

如此简单,让我们直接跳入一些代码示例。

public interface MyInterface {

  default void defaultMethod() {
    privateMethod("Hello from the default method!");
  }

  private void privateMethod(final String string) {
    System.out.println(string);
  }

  void normalMethod();
}

public class MyClassWithDefaultMethod implements MyInterface {

  @Override
  public void normalMethod() {
    System.out.println("Hello from the implemented method!");
  }
}

从上面的基本代码片段可以看出,接口上定义了默认方法,该方法又调用了私有方法。 顾名思义,这是默认方法,因此由于MyClassWithDefaultMethod没有提供实施defaultMethod它将继续使用接口上定义的内容。 因此,如果defaultMethod和正常方法被称为它们将产生以下输出。

Hello from the default method!
Hello from the implemented method!

确实没有太多。 如果您想在类中提供默认方法的自己实现,则与使用普通接口方法一样,只需添加一个具有相同名称的方法,最好弹出@Override在其顶部的注释。

public class MyClassOverrideDefaultMethod implements MyInterface {

  @Override
  public void normalMethod() {
    System.out.println("Hello from the implemented method!");
  }

  @Override
  public void defaultMethod() {
    System.out.println("I have overridden the default method!!");
  }
}

关于此代码,实际上没有什么要说的,因为它看起来像是实现了接口的普通类。 运行时,它将产生以下输出,而不是先前显示的输出。

I have overridden the default method!!
Hello from the implemented method!

这是向接口添加默认和私有方法的基础。 下面,我们将更深入地了解默认方法以及为什么首先使用它们。

因此,一个类可以具有多个接口,现在一个接口可以定义自己的默认方法。 如果一个类实现多个接口,每个接口都定义了相同的默认方法,将会发生什么? 好吧,实际上并不会发生太多事情,因为它将无法编译并产生以下错误。

java: class MyClassWithTwoInterfaces inherits unrelated defaults for defaultMethod() 
from types MyInterface and MyOtherInterface

正如您可能会发现的那样,它无法确定应实际使用的默认方法,因此会崩溃。 为了解决这种情况,我们需要提供一个实现,该实现将覆盖接口提供的类所使用的版本,以代替使用该类,从而消除导致错误的歧义。

移至下一点。 类可以重写默认接口方法,并通过使用调用原始方法超, keeping it nicely in line with calling a 超 method from an extended class. But there is one catch, you need to put the name of the interface before calling 超即使仅添加一个接口,这也是必需的。 这是有道理的超通常是指扩展类,并且由于允许使用多个接口将其限制为始终被调用,因此可以保持其一致且无歧义。 下面是一个看起来像这样的代码片段。

public class MyClassWithTwoInterfaces implements MyInterface, MyOtherInterface {

  @Override
  public void normalMethod() {
    // some implementation
  }

  @Override
  public void defaultMethod() {
    MyInterface.super.defaultMethod();
    MyOtherInterface.super.defaultMethod();
  }
}

能够打电话超默认接口方法上的错误也可以解决多个接口中相同默认方法的错误。 您仍然需要重写方法本身,但是您不需要编写太多内容,如果其中一个原始版本满足您的需求,您可以调用超您想要并完成的实现。

作为一个接口可以扩展另一个接口,当两个接口都包含相同名称的默认方法时会发生什么? 我敢肯定,大多数人都可以找到答案,但万一您不能简单地从子接口/层次结构树最下方的接口中获取实现。

public interface MyInterface {

  default void defaultMethod() {
    System.out.println("Hello from the parent interface!");
  }
}

public interface MyOtherInterface extends MyInterface {

  default void defaultMethod() {
    System.out.println("Hello from the child interface!");
  }
}

当一个类实现时MyOther接口和电话defaultMethod它会打印出来。

Hello from the child interface!

如您所见,它已经调用了defaultMethod从子界面中MyOther接口。 这使它与从类中为默认方法提供实现保持一致,如果它包含在子/实现中,则它将使用该方法代替父接口上定义的原始方法。

那么,为什么要首先使用默认方法呢? 进行一些谷歌搜索之后,似乎将它们添加到Java 8中,作为一种添加方法以准备Lambda表达式而不会破坏实现现有接口的代码的方式。 因此,如果我们有一个使用了已更改接口的类(例如,第三方库中的代码),则无需担心会向该接口添加任何新方法,因为我们现有的代码仍然可以使用并且新的 该方法可以忽略,直到以后。 通过使用此示例,我认为对于API /库开发人员而言,考虑使用默认方法比在自己的代码库中编写代码(在代码库中他们可以控制一切并可以更改已被破坏的任何类的代码)更重要。 添加新的接口方法。

以下是一些代码片段,可帮助您更清楚地说明上述几点(如果尚未完成的话)。

public class MyClass implements MyOldInterface {

  @Override
  public void doStuff() {
    // does stuff
  }
}

public interface MyOldInterface {

  void doStuff();
}

因此,这里我们有一个很好的环境,因为它实现了接口上定义的方法,并且不需要其他工作。 然后,我们毫不关心地出现了,并向界面添加了新方法。

public interface MyNewInterface {

  void doStuff();

  void doSomeMore();
}

当我们尝试编译代码时,它将失败,因为我们没有提供实现doSomeMore。 显然,这使我们哭泣,因为我们需要编写一些额外的代码,即使它只是一些半精打采的代码,也只是为了让我们再次使用它。 而如果以前的代码是写的……

public interface MyNewInterface {

  void doStuff();

  default void doSomeMore() {
    // do some more stuff
  }
}

我们将很高兴,因为我们现有的课程不需要任何额外的工作,并且仍会进行编译。 当我们最终决定需要实现添加到接口的新方法时,可以照常执行。 此外,如果doSomeMore方法足够长,也许可以使用一个或两个私有方法来使界面保持整洁,从而帮助您使使用代码的每个人都开心!

我认为几乎可以解决这个问题。 总之,默认方法是Java 8的一部分,而私有方法是Java 9的附加功能。默认方法允许接口定义方法的实现,因此,当类实现该接口时,无需提供其自己的版本。 这种方法可以帮助API和库向前发展,而当接口需要其他方法时,无需始终进行重大更改。 希望这篇文章展示了它们的易用性,尽管仅仅因为它们很简单并不意味着应该在各处添加它们,并且只关心自己的代码库的开发人员可能永远不会发现需要使用它们。 我在这里几乎忘了提到私有方法,但是坦率地说,这是因为关于它们的讨论不多,如果您在这篇文章中注意到的话,几乎没有提及它们。 接口中的私有方法可以使代码看起来更好,并提供一些代码重用的选项。

If you found this post helpful, please share it and if you want to keep up with my latest posts then you can follow me on Twitter at @LankyDanDev.

from: https://dev.to//lankydandev/default-and-private-methods-in-interfaces-241k

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值