[java] Java가 인터페이스에서 개인 멤버를 허용하지 않는 이유는 무엇입니까?

Java가 인터페이스에서 개인 멤버를 허용하지 않는 이유는 무엇입니까? 특별한 이유가 있습니까?



답변

로부터 Java 언어 사양 (액세스 제어) :

“Java 프로그래밍 언어는 액세스 제어를위한 메커니즘을 제공하여 패키지 또는 클래스의 사용자가 해당 패키지 또는 클래스 구현의 불필요한 세부 사항에 의존하지 않도록 방지합니다.”

액세스 제어는 구현 세부 정보를 숨기는 것입니다. 인터페이스에는 숨길 구현이 없습니다.


답변

Java 9에서는 인터페이스의 개인 메서드가 가능합니다.

Java 9 사양

javac 컴파일러 팀은 JDK의 9 b54 빌드로 시작하는 인터페이스의 private 메서드에 대한 컴파일러 지원을 발표하게되어 기쁩니다.


답변

개인 인터페이스 메소드는 JEP-213의 일부인 Java 9의 일부입니다 . Java 8의 인터페이스는 기본 메소드를 가질 수 있으므로 비공개 메소드를 사용하면 여러 기본 메소드에서 공유 비공개 메소드를 사용할 수 있습니다.


답변

Java 8부터 인터페이스는 기본 메소드를 가질 수 있으며 Java 9부터 인터페이스는 동일한 인터페이스의 기본 메소드로만 액세스 할 수있는 개인 메소드를 가질 수 있습니다.


답변

인터페이스는 인터페이스를 구현하는 모든 클래스에서 제공하는 API를 설명하는 데 사용됩니다. 정의의 인터페이스에는 상태가 없으므로 필드 멤버를 선언 할 필요가 없습니다.


답변

그러한 인터페이스를 구현할 방법이 없습니다. 내가 제시 한 질문에 대한 대답 은 비공개 메소드로 인터페이스를 구현하는 것이 불가능하다는 것을 강력하게 제안합니다.

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프로그래밍 언어 범위에 따라 선언 된 범위로 private members제한되며 해당 class메서드에 의해서만 액세스 할 수 있습니다 class. 그러나 inteface메서드 본문이 없으므로 .NET 내부에 private 멤버를 선언 할 필요가 없습니다 interface.