【发布时间】:2015-07-16 10:50:48
【问题描述】:
当我试图编译以下代码时
public interface SomeInterface{
private static Logger logger = Logger.getLogger();
public default void someMethod(){
logger.info("someMethod: default implementation");
}
}
我收到一个错误
Illegal modifier for the interface field SomeInterface.logger; only public, static & final are permitted
当我删除 private 修饰符时,代码会编译,但我不希望包中的其他类看到此字段。
为什么当 Java 确实有意义时却不允许我做这样的事情?
【问题讨论】:
-
如果重写 someMethod 方法会怎样?
-
@Stultuske 我将提供新的实现。如果我不覆盖它会怎样?
-
从逻辑上讲,接口旨在提供一种概括几个不同类的行为的方法。那就是 - 用户必须做什么来控制该类的行为。以汽车(在现实生活中)为例:您有车轮、收音机、制动器、离合器等。您了解这些并学习如何操作它们。但是如果接口包含一些你无法访问的东西——你将如何使用它来控制类的行为?换句话说 - 接口是你通往世界的门户 - 使用它们来概括而不是隐藏字段等......
-
@Mackiavelli 但默认实现需要此私有字段。接口的本意是不提供任何实现,但 Java 8 稍微改变了这一点。
-
我知道人们会说这是不正确的,但在某种程度上,接口越来越接近 cpp 抽象类。为什么?我不知道。但是实施应该注意这一点。实现接口的用户根本不应该查看私有内容。
标签: java interface java-8 private-members