Kam*_*osz 10 java interface private-members java-8
当我尝试编译以下代码时
public interface SomeInterface{
private static Logger logger = Logger.getLogger();
public default void someMethod(){
logger.info("someMethod: default implementation");
}
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
Illegal modifier for the interface field SomeInterface.logger; only public, static & final are permitted
Run Code Online (Sandbox Code Playgroud)
当我删除private修饰符时,代码编译,但我不希望包中的其他类看到此字段.
为什么Java在实际上有意义时不允许我做这样的事情?
Bri*_*etz 15
在Java-8之前的世界观中,接口纯粹是用于接口契约,而私有成员纯粹是为了实现而存在,所以这种限制是完全合理的.
在Java-8之后的世界中,接口可以承载行为(但不是状态),因此询问是否应该将其他类的特性应用于接口也是合理的.(但是,仅仅因为某些东西可能是"合理的"并不意味着它必须得到支持;构建世界的方法通常不止一种.)
在Java 9中,将支持接口中的私有方法.
接口不是类.他们没有私人国家.即使是界面中的公共记录器也是设计气味和滥用界面.
接口中静态字段的用例主要用于编译时常量,而不是有状态对象.