从Java 8开始,我们可以在接口中使用默认方法和静态方法.
常量接口模式是对称为Constant Interface Antipattern的接口的不良使用.
>有效的Java,第17项:
常量接口模式是接口的不良使用.类在内部使用一些常量是一个实现细节.实现常量接口会导致此实现细节泄漏到类的导出API中.类的用户实现一个常量接口并不重要.事实上,它甚至可能使他们感到困惑.更糟糕的是,它代表了一种承诺:如果在将来的版本中修改了类以便它不再需要使用常量,它仍然必须实现接口以确保二进制兼容性.如果非最终类实现了一个常量接口,那么它的所有子类的命名空间都会受到接口中常量的污染.
java平台库中有几个常量接口,例如java.io.ObjectStreamConstants.这些接口应视为异常,不应模拟.
如果使用常量接口是一种不好的做法,那么使用接口静态方法可能会成为一种不好的做法?
常量接口的主要问题不是包含大量常量的接口.
当类实现该接口时,它们可以更容易地访问常量:
public interface Foo {
public static final int CONSTANT = 1;
}
public class NotOkay implements Foo {
private int value = CONSTANT;
}
public class Okay {
private int value = Foo.CONSTANT;
}
Run Code Online (Sandbox Code Playgroud)
类NotOkay不仅在接口Foo和它自身之间创建了一个虚假的关系(实际上没有什么可以实现),但是常量值成为其公共API的一部分.
(static import在Java 5中引入s 之前,这种做法更为常见.)
使用静态接口方法实现接口实际上没有意义,因为您无法以相同的方式访问它们:静态接口方法不会被继承.
什么时候使用接口静态方法可能成为一种不好的做法?
专家告诉我(我认为是 Angelika Langer 和 Klaus Kreft 在 Java 用户组活动中),当你有一些静态方法时,通常可以将它们放在接口中(请参阅Stream),但如果有如果它们很多,那么最好将它们放在实用程序类中(请参阅Collectors)。否则将很难看到接口的实际方法。
这似乎是有道理的,并且是一个值得遵守的良好经验法则。