Mat*_*ten 84
"Java编程语言提供了访问控制机制,以防止包或类的用户依赖于该包或类的实现的不必要细节."
访问控制就是隐藏实现细节.接口没有要隐藏的实现.
没有办法实现这样的接口. 我提出的一个问题的答案强烈暗示,实现具有私有方法的接口是不可能的(没有根本改变规则) - 这留下了为什么不允许保护和包私有方法的问题.
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)
根据Java
编程语言的范围,private members
它仅限于class
声明它,并且只能通过它的方法访问class
.但是inteface
没有方法体,因此没有使用声明私有成员的内部interface
.
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)