Java 8:使用静态方法而不是静态util类接口

mar*_*hin 23 java static java-8

当我需要一堆无状态实用程序方法时,Java 8中的最佳实践是什么.是不是有将一个接口不会被任何人,即实现public interface Signaturespublic interface Environments,或者是更好的做旧的方式-有public final class Signaturespublic final class Environments私人构造|| 枚举?

Stu*_*rks 28

接口的主要目的是提供该类型的操作(方法)的类型和词汇表.它们是有用且灵活的,因为它们允许多个实现,实际上它们被设计为允许在类层次结构中不相关的实现.

问题是,

拥有一个不会被任何人实现的界面是正确的吗?

在我看来,这样可以减少对接口的影响.人们必须环顾API以确定没有实现此接口的类,并且没有此接口的生产者或使用者.有人可能会感到困惑,并试图创建一个接口的实现,但当然他们不会走得太远.虽然可以使用所有静态方法的"实用程序接口",但这并不像旧的不可构造的最终类成语那样清晰.后者的优点是类可以强制执行不能创建任何实例.

如果你看一下新的Java 8 API,你会发现尽管能够在接口上添加静态方法,仍然会使用最终的类习惯用法.

接口上的静态方法已经用于诸如工厂方法之类的东西来创建那些接口的实例,或者用于对这些接口的所有实例具有普遍适用性的实用方法.例如,请参阅Stream和中的Collector接口java.util.stream.每个人都有静态工厂:Stream.of(),Stream.empty(),和Collector.of().

但另请注意,每个都有伴随实用程序类StreamSupportCollectors.这些是纯实用程序类,仅包含静态方法.可以说它们可以合并到相应的接口中,但这会使接口混乱,并且会模糊类中包含的方法的关系.例如,StreamSupport包含一系列相关的静态方法,它们都是Spliterator和之间的所有适配器Stream.合并这些Stream可能会让事情变得混乱.


kg_*_*sYy 6

我会用最后一堂课.更好地告诉我它是一个带有一些实用方法的辅助类.接口定义是我期望实现的东西,以及帮助某人实现接口的方法.