Java8:当使用接口静态方法成为一种不好的做法时?

Java8:当使用接口静态方法成为一种不好的做法时?,java,interface,Java,Interface,在Java8中,我们可以在接口中使用默认方法和静态方法 常量接口模式是对称为常量接口反模式的接口的不当使用 ,项目17: 恒定接口模式是对接口的不当使用。类在内部使用某些常量是一个实现细节。 实现常量接口会导致此实现详细信息 泄漏到类的导出API中。这对公众没有影响 类实现常量接口的类的用户。在里面 事实上,这甚至可能让他们感到困惑。更糟糕的是,它代表了一种承诺:如果 在将来的版本中,该类将被修改,以便不再需要 要使用常量,它仍然必须实现接口以确保 二进制兼容性。如果非最终类实现了常量 接口,其

在Java8中,我们可以在接口中使用默认方法和静态方法

常量接口模式是对称为常量接口反模式的接口的不当使用

,项目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;
}
NotOkay
不仅在接口
Foo
和它本身之间创建了一个伪关系(实际上没有什么可实现的),而且常量值成为它的公共API的一部分

(在Java 5中引入
静态导入之前,这种做法更为常见。)

对于静态接口方法,实现接口实际上毫无意义,因为您不能以相同的方式访问它们:静态接口方法不会被继承

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

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


这似乎是有道理的,而且是一个很好的经验法则。

我不明白为什么有人会实现这个接口,而不是指定
Foo.CONSTANT
导入静态Foo.CONSTANT(如果可以的话),但是,是的,我知道为什么这是一个坏习惯。@EpicPandaForce在引入静态导入之前(在Java 5中),这种坏习惯很普遍。啊。。。这是有道理的。Java在1.5之前是地狱。@EpicPandaForce它甚至被用于JDK。看看SwingConstants界面。@biziclop这就是我要说的。这里有一个指向罪犯的链接