Java 8:当使用Interface静态方法成为一种不好的做法?

Jes*_*rce 8 java interface

从Java 8开始,我们可以在接口中使用默认方法和静态方法.

常量接口模式是对称为Constant Interface Antipattern的接口的不良使用.

>有效的Java,第17项:

常量接口模式是接口的不良使用.类在内部使用一些常量是一个实现细节.实现常量接口会导致此实现细节泄漏到类的导出API中.类的用户实现一个常量接口并不重要.事实上,它甚至可能使他们感到困惑.更糟糕的是,它代表了一种承诺:如果在将来的版本中修改了类以便它不再需要使用常量,它仍然必须实现接口以确保二进制兼容性.如果非最终类实现了一个常量接口,那么它的所有子类的命名空间都会受到接口中常量的污染.

java平台库中有几个常量接口,例如java.io.ObjectStreamConstants.这些接口应视为异常,不应模拟.

如果使用常量接口是一种不好的做法,那么使用接口静态方法可能会成为一种不好的做法?

biz*_*lop 9

常量接口的主要问题不是包含大量常量的接口.

当类实现该接口时,它们可以更容易地访问常量:

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 之前,这种做法更为常见.)

使用静态接口方法实现接口实际上没有意义,因为您无法以相同的方式访问它们:静态接口方法不会被继承.

  • 我不明白为什么有人会为此实现接口,而不是指定`Foo.CONSTANT`或`import static Foo.CONSTANT;`(如果可行),但是,是的,我可以看出为什么这是一个坏习惯. (2认同)
  • @EpicPandaForce在引入静态导入之前,这种不好的做法很普遍(在Java 5中). (2认同)
  • @EpicPandaForce它甚至在JDK中使用过.例如.看看SwingConstants界面. (2认同)

Puc*_*uce 5

什么时候使用接口静态方法可能成为一种不好的做法?

专家告诉我(我认为是 Angelika Langer 和 Klaus Kreft 在 Java 用户组活动中),当你有一些静态方法时,通常可以将它们放在接口中(请参阅Stream),但如果有如果它们很多,那么最好将它们放在实用程序类中(请参阅Collectors)。否则将很难看到接口的实际方法。

这似乎是有道理的,并且是一个值得遵守的良好经验法则。