为什么Java不允许私有成员进入接口?

dpp*_*dpp 77 java

为什么Java不允许私有成员进入接口?有什么特别的原因吗?

Mat*_*ten 84

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

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

访问控制就是隐藏实现细节.接口没有要隐藏的实现.

  • Java 9允许接口中的私有方法,在添加默认方法后是合乎逻辑的,参考号:https://bugs.openjdk.java.net/browse/JDK-8071453 (26认同)
  • 由于我们可以将嵌套类放在接口中,因此我们可以在接口上放置实现.这样做是非常错误的,但我们可以. (9认同)
  • 它听起来并不坏.接口中的私有方法只能通过同一接口中的默认方法访问.其中一个好处是帮助将默认方法的实现分解为有意义的小函数,而不会破坏封装. (4认同)
  • “这样做是非常错误的。”一如既往地取决于上下文。 (2认同)

chi*_*tiz 41

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

Java 9规范

javac编译器团队很高兴地宣布从9 b54 build of JDK开始的接口中私有方法的编译器支持的可用性.

  • @SebiSebi,当你意识到Java是一种现场语言的那一刻. (9认同)
  • @Arashsoft,OP 正在请求字段。 (2认同)

mko*_*bit 15

私有接口方法是Java 9的一部分,是JEP-213的一部分.由于Java 8中的接口可以具有默认方法,因此私有方法允许多个默认方法使用共享私有方法.


Pet*_*rey 11

从Java 8开始,接口可以具有默认方法,并且从Java 9开始,允许接口具有私有方法,这些方法只能通过同一接口中的默认方法访问.


gio*_*shc 9

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


emo*_*ory 7

没有办法实现这样的接口. 我提出的一个问题的答案强烈暗示,实现具有私有方法的接口是不可能的(没有根本改变规则) - 这留下了为什么不允许保护和包私有方法的问题.

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
     }
}
Run Code Online (Sandbox Code Playgroud)

以下代码应达到预期效果.尽管所有方法都是公开的,但只有公共方法才是公开的.受保护的方法得到有效保护 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 ( ) ; }
}
Run Code Online (Sandbox Code Playgroud)


Nis*_*ant 6

根据Java编程语言的范围,private members它仅限于class声明它,并且只能通过它的方法访问class.但是inteface没有方法体,因此没有使用声明私有成员的内部interface.


i_a*_*ero 5

Java 在 Java 9 中允许接口中存在私有方法。默认方法是在 Java 8 中引入的。有可能多个默认方法想要共享一些代码,那么可以将这些代码移至私有方法而不将其暴露给外部世界。此错误已得到修复,并且从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
   }
}
Run Code Online (Sandbox Code Playgroud)