为什么Java 8接口中不允许使用`private static`字段?

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中,将支持接口中的私有方法.

  • 为什么私有静态最终字段被排除在外? (4认同)
  • “在 Java 9 中,将支持接口中的私有成员” - 似乎只支持 _private 方法_,而不支持 _private 静态最终字段_?你有什么关于为什么私有静态最终字段被遗漏的信息吗? (3认同)
  • 他们从来没有参加过。我应该在上面说“方法”,因为这一直都是计划。认为是错字。(答案已被编辑。) (2认同)

Mar*_*nik 9

接口不是类.他们没有私人国家.即使是界面中的公共记录器也是设计气味和滥用界面.

接口中静态字段的用例主要用于编译时常量,而不是有状态对象.

  • 它不是在正确使用时,它在接口自己的API方面提供了便利方法. (3认同)