【问题标题】:Correct way to create private methods in an interface Java在接口 Java 中创建私有方法的正确方法
【发布时间】:2020-01-20 21:06:47
【问题描述】:

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

【问题讨论】:

  • 也许你应该考虑某种工厂模式。工厂只能向最终用户公开公共接口,但允许它创建您想要在内部使用的任何实例......作为一个想法
  • 我听不懂,呵呵,你能给我举个例子吗?

标签: java dao


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 嗯,我这样理解你,我将不得不在接口中编写方法的代码,不是吗?我需要在实现我的接口的类中编写它
  • 这取决于您要达到的目标。如果默认实现可以被子类重用或者甚至不需要重新实现,那么默认方法是好的。如果您遵循 mixin 设计策略,您将使用非默认方法为默认方法提供状态。
  • 从这个意义上说,私有接口方法对实现子类没有用处。这就是提倡受保护的接口方法之类的地方
  • 我的意思是,主要问题是我有一个扩展 Autocloseable 的 Dao 接口,但我想在实现 Dao 的类中创建一些私有方法,但我无法在没有的情况下在 Dao 中定义它们在那里编写代码,如果我在我的类中创建它们,它们将不会实现自动关闭
【解决方案2】:

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

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

总结一下:

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

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

问:如果我在类中创建了一个私有方法但没有从 Dao 覆盖会发生什么?

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

  1. 方法被标记为abstract:你会得到一个编译错误,说你的实现类不满足父类的规范。

1.1 如果您在接口中声明了一个方法并且您没有实现它,您将收到同样的错误,指出您的实现类不满足它试图实现的接口。

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

【讨论】:

  • private 方法在接口中确实有意义,因为在接口中引入了default 方法;看另一个答案。
  • Java 1.8 不允许在接口中使用私有方法
  • 这个问题没有被标记为java-8,并且问题中没有任何内容表明它与Java 8有关。
  • 也没有标记java-9^,但由于它是采用的最广泛的API,我假设提出问题的人可能正在使用该版本。我的道歉
  • 由于问题是专门关于在接口中编写私有方法,并且问题是关于最佳实践而不是如何解决编译错误,因此假设 OP 使用的是Java 允许在接口中使用私有方法。
猜你喜欢
  • 2016-11-25
  • 1970-01-01
  • 2018-06-21
  • 2018-05-06
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
相关资源
最近更新 更多