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

在Java接口中创建私有方法的正确方法,java,dao,Java,Dao,我正在处理一个数据库,我创建了一个名为Dao的公共接口,它扩展自AutoCloseabe,所以我有一个实现这个接口的类,但我想在那里创建一些私有方法,但它们仍然需要AutoCloseabe。 所以我的问题是,如果不在接口中定义私有方法,我就不能在接口中创建它们。如果我在类中创建一个私有方法但不从Dao重写,会发生什么情况?他们不会有自动关闭的,是吗?。如果没有,我可以实现哪种解决方案?私有方法在接口中没有多大意义,因为接口的主要思想是为对象提供相互交互的接口。因为私有方法对其他对象不可见,所以它

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

私有方法在接口中没有多大意义,因为接口的主要思想是为对象提供相互交互的接口。因为私有方法对其他对象不可见,所以它们不能使用它们来通信和发送消息

如果您想要私有方法,我建议您使用
抽象类

综上所述:

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

这正是
接口
的要点;它们定义了一个公共API,而不关心内部实现

Q:如果我在类中创建一个私有方法,但不从Dao重写,会发生什么情况?

如果在
抽象类中声明一个方法,并且不重写它,则可能会发生两种情况:

  • 该方法被标记为
    abstract
    :您将得到一个编译错误,说明您的实现类不满足父类的规范
  • 1.1如果您在接口中声明了一个方法,但没有实现它,您将得到相同的错误,说明您的实现类不满足它试图实现的接口

  • 该方法是
    public
    ,未在
    抽象类中标记为
    final
    :您可以覆盖它,也可以不覆盖它。如果不重写它,将使用父类实现;如果您完全重写它,您的子类代码将被执行。如果调用super.method()然后调用您的实现,这两个代码都将被执行

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

    default public boolean tryHeads() {
        return flip();
    }
    
    default public boolean tryTails() {
        return !flip();
    }
    
    private boolean flip() {
        return ThreadLocalRandom.current().nextBoolean();
    }
    

    这是非常简单的。但是请看更多的见解。

    也许你应该考虑某种工厂模式。工厂只能向最终用户公开公共接口,但允许它创建您想要在内部使用的任何实例。。。作为一个想法,我不理解你,呵呵,你能给我举个例子吗?
    private
    方法在接口中是有意义的,因为在接口中引入了
    default
    方法;参见另一个答案。Java 1.8不允许在接口中使用私有方法。问题没有标记为
    Java-8
    ,问题中没有任何内容说明它是关于Java 8的。也没有标记为
    Java-9^
    ,但由于它是采用最广泛的API,我假设提出问题的人可能会使用该版本。很抱歉,问题是关于在接口中编写私有方法,而问题是关于最佳实践,而不是如何解决编译错误,假设OP使用的Java版本允许在接口中使用私有方法是明智的。Mmm,我用这种方式让你明白,我必须在接口中编写方法的代码,不是吗?我需要在实现接口的类中编写它,这取决于您试图实现的目标。如果默认实现可以被子类重用,或者甚至不需要重新实现,那么默认方法是好的。如果您遵循mixin设计策略,您将使用非默认方法为默认方法提供状态。从这个意义上讲,私有接口方法对于实现子类没有用处。这就是提倡保护接口方法的地方。我的意思是,主要的问题是我有一个扩展了Autocloseable的Dao接口,但是我想在实现Dao的类中创建一些私有方法,但是如果不在Dao中编写代码,我无法在Dao中定义它们,如果我在类中创建它们,它们将不会实现自动关闭