在接口中创建私有方法的正确方法 Java

Correct way to create private methods in an interface Java

我正在使用一个数据库,我创建了一个名为 Dao 的 public 接口,它扩展了 AutoCloseabe,所以我有一个 class 实现了这个接口,但我想创建一些私有方法在那里,但他们仍然需要 Autocloseable。 所以我的问题是,如果不在接口中定义它们,我就不能在接口中创建私有方法。如果我在 class 中创建一个私有方法但不从 Dao 覆盖,会发生什么情况?他们不会自动关闭,对吗?如果不能,我可以实施哪种解决方案?

私有方法在接口中没有多大意义,因为接口的主要思想是提供一个 接口 供对象相互交互。由于私有方法对其他对象不可见,因此它们无法使用它们进行通信和发送消息。

如果您想使用私有方法,我建议您改用 abstract class

总结一下:

问:所以我的问题是,我不能在接口中创建私有方法而不在接口中定义它们

这正是 interface 的要点;他们定义了一个 public API 而不关心内部实现。

问:如果我在 class 中创建私有方法但不从 Dao 中覆盖会怎样?

如果您在 abstract class 中声明了一个方法并且没有覆盖它,可能会发生两种情况:

  1. 该方法被标记为 abstract:您将收到一个编译错误,指出您的实现 class 不满足父 class 的规范。

1.1 如果您在接口中声明了一个方法但没有实现它,您将得到同样的错误,说明您的实现 class 不满足它试图实现的接口。

  1. 该方法是 public 而未在 abstract class 中标记为 final:您可能会也可能不会覆盖它。如果不覆盖它,将使用父 class 实现;如果你完全覆盖它,你的子 class 代码将被执行。如果您先调用 super.method() 然后再调用您的实现,那么这两个代码都会被执行。

在 Java 9 中引入接口中私有方法的动机与您在任何其他 class 主体中使用私有方法的原因相同。它允许您将代码分解为可重用、可管理的非继承方法:

default public boolean tryHeads() {
    return flip();
}

default public boolean tryTails() {
    return !flip();
}

private boolean flip() {
    return ThreadLocalRandom.current().nextBoolean();
}

这过于简单化了。但请参阅 a similar question from me 了解更多信息。