在接口中创建私有方法的正确方法 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
中声明了一个方法并且没有覆盖它,可能会发生两种情况:
- 该方法被标记为
abstract
:您将收到一个编译错误,指出您的实现 class 不满足父 class 的规范。
1.1 如果您在接口中声明了一个方法但没有实现它,您将得到同样的错误,说明您的实现 class 不满足它试图实现的接口。
- 该方法是
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 了解更多信息。
我正在使用一个数据库,我创建了一个名为 Dao 的 public 接口,它扩展了 AutoCloseabe,所以我有一个 class 实现了这个接口,但我想创建一些私有方法在那里,但他们仍然需要 Autocloseable。 所以我的问题是,如果不在接口中定义它们,我就不能在接口中创建私有方法。如果我在 class 中创建一个私有方法但不从 Dao 覆盖,会发生什么情况?他们不会自动关闭,对吗?如果不能,我可以实施哪种解决方案?
私有方法在接口中没有多大意义,因为接口的主要思想是提供一个 接口 供对象相互交互。由于私有方法对其他对象不可见,因此它们无法使用它们进行通信和发送消息。
如果您想使用私有方法,我建议您改用 abstract class
。
总结一下:
问:所以我的问题是,我不能在接口中创建私有方法而不在接口中定义它们。
这正是 interface
的要点;他们定义了一个 public API 而不关心内部实现。
问:如果我在 class 中创建私有方法但不从 Dao 中覆盖会怎样?
如果您在 abstract class
中声明了一个方法并且没有覆盖它,可能会发生两种情况:
- 该方法被标记为
abstract
:您将收到一个编译错误,指出您的实现 class 不满足父 class 的规范。
1.1 如果您在接口中声明了一个方法但没有实现它,您将得到同样的错误,说明您的实现 class 不满足它试图实现的接口。
- 该方法是
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 了解更多信息。