为什么Java不允许私人成员在界面中?

为什么Java不允许私人成员在界面中? 有什么特别的原因吗?

从Java语言规范(访问控制) :

“Java编程语言为访问控制提供了机制,以防止包或类的用户依赖于该包或类的实现的不必要的细节。”

访问控制就是隐藏实现细节。 一个接口没有隐藏的实现。

在Java 9中,接口中的私有方法将是可能的。

Java 9规范

javac编译器团队很高兴地宣布编译器支持JDK的9 b54版本开始的接口中的私有方法。

作为JEP-213的一部分,私有接口方法将成为Java 9的一部分。 由于Java 8中的接口可以有默认方法 ,所以私有方法可以允许多个默认方法使用共享私有方法。

一个接口用于描述由任何实现接口的类提供的API。 由于其定义的接口没有状态,因此不需要声明字段成员。

根据Java编程语言, private members范围仅限于声明的class ,并且只能由class的方法访问。 但是, inteface没有方法体,因此在inteface中没有声明私有成员的用法。

没有办法实现这样的接口。 对我提出的问题的一个回答强烈地表明,用私有方法实现一个接口是不可能的(没有根本改变规则) – 这就产生了为什么不允许保护和打包私有方法的问题。

 class OuterClass { void run ( MyInterface x ) { x . publicMethod ( ) ; // why not? x . protectedMethod ( ) ; // why not? x . packagePrivateMethod ( ) ; // why not? x . privateMethod ( ) ; // why not? } interface MyInterface { public abstract void publicMethod ( ) ; // OK protected abstract void protectedMethod ( ) ; // why not? abstract void packagePrivateMethod ( ) ; // in interface default is public, but why not package private private void privateMethod ( ) ; // impossible to implement } class MyImpl implements MyInterface { public void publicMethod ( ) { } // ok protected void protectedMethod ( ) { } // no sweat void packagePrivateMethod ( ) { } // no sweat private void privateMethod ( ) { } // not happening } } 

下面的代码应该达到预期的结果。 即使所有的方法都是公开的,只有公开的方法才是公开的。 受保护方法得到有效保护。 packagePrivateMethod是有效的packagePrivate。 privateMethod实际上是私有的。

 class WorkAround { void run ( MyPrivateInterface x ) { x . publicMethod ( ) ; x . protectedMethod ( ) ; x . packagePrivateMethod ( ) ; x . privateMethod ( ) ; } public interface MyPublicInterface { void publicMethod ( ) ; } protected interface MyProtectedInterface extends MyPublicInterface { void protectedMethod ( ) ; } interface MyPackagePrivateInterface extends MyProtectedInterface { void packagePrivateMethod ( ) ; } private interface MyPrivateInterface extends MyPackagePrivateInterface { void privateMethod ( ) ; } } 

从Java 8开始,接口可以具有默认方法,并且从Java 9开始,接口将被允许具有私有方法,这些私有方法只能由相同接口中的默认方法访问。

这是因为他们是无用的。

没有办法调用私有方法。

私人成员是一个实现细节。 一个接口是一个类可以承担的公共angular色。

私人领域不会完全无用,因为其他领域和内部类可以访问它们。

然而,即使在嵌套的类中,私有方法也无法实现,使得它们几乎无用。 你可以使用reflection来阅读,但这是一个边缘情况。

Java允许Java 9中的接口使用私有方法 。 默认方法是在Java 8中引入的。多个默认方法可能需要共享一些代码,然后可以将这些代码移动到私有方法而不会将其暴露给外部世界。 这个bug已经被修复,从JDK 9 build 54开始,编译器对私有接口方法的支持已经复活了。

 public interface IData{ default void processData(int data) { validate(data); // do some work with it } default void consumeData(int data) { validate(data); // do some work with it } private void validate(int data) { // validate data } } 

私人成员在界面上没有意义。 接口是一种使用已定义的方法访问类的方法,您无需查看该类的内部函数。

私人会员不同意这一点。

声明为private的类的成员不会被该类的子类inheritance。 只有被声明为protected或public的类的成员才能被声明在包中声明的子类inheritance。

资源

所以你没有任何工作方法在一个接口,可以使用该私人非可inheritance的领域,那么它为什么应该存在?

是的,不能这样做。 对于所有那些评论为什么它不应该:

假设我有A类,它利用接口I.B类扩展了A类,因此也inheritance了A中的所有接口方法。

现在,想象一下,我想在A类中使用一个私有方法,但是也希望为其他类定义一个私有方法(也许是一个C类,它不一定扩展B类或A类)。

也许对于“初始化”方法,我想要所有使用I接口的类。 但显然,我不希望初始化方法是公开的,因为它只能被使用一次,或者被认为是必要的,而不仅仅是因为你想要使用它。

唯一的解决方法是解决方法,或者只需将init方法强制到没有接口的类本身中。

我不太了解这个原因,当然,但是,有时候它可以派上用场。 很明显,甲骨文表示同意,因为他们允许在JDK 9中使用专用接口方法。

我所做的,无论如何,是放置一个简单的布尔variables,这样的接口方法(应该是私人的)可以被标记为true(初始化= true)设置一次后。 然后再次调用时,这个方法什么都不做。 这样,接口方法可以实现为public方法,但是由于(我的类的构造方法)首先调用方法,因此将variables设置为true,因此不能再次调用该方法。

否则,如果只想让类的内部工作使用它,则必须尝试一种不同的解决方法….也许一种方法本身会在使用它时设置一个标志。 当该标志为假时,该方法什么都不做(当有人从课堂外调用时)。 但是,当这些类自己的方法调用它时,他们很快将该标志设置为true,然后调用该方法,然后将该标志设置为false?

最后一种静音。 现在可能只是简单地将私有类放入类中,并完全切除接口。