为什么Java 8中要有单独的Spliterator类?

4
为什么Java 8中出现了新的Spliterators类?自Java 8以来,我们可以在接口中添加静态方法。由于Spliterators类只有静态方法,将所有方法声明在Spliterator接口中是否更简单?
同样的问题也适用于Collectors/Collector一对。
谢谢。
3个回答

9
这个决定很可能是在没有考虑到这个全新的可能性的情况下做出的,而只是遵循自20年来已经建立的模式。此外,是否真的有必要在接口中添加25到30个静态方法是可以争论的。提供一些规范实现的工厂是有意义的,但你应该在某个地方划线。因为它们被同一个库提供,所以不可行将工厂添加到所有接口实现中。但这个辩论会离题。此外,Spliterators 不仅提供静态方法,还提供嵌套类。与静态方法不同,当在接口中定义时,这些类会污染每个实现类的命名空间。Collectors 和 Spliterators 也可能包含特定于实现的非公共方法甚至字段。

2
你的回答中我最喜欢的是关于污染的推理。1+ - Eugene

2
不,这不是一个好主意,因为接口声明了一个契约,而类则代表着逻辑。但在Java 8中添加了默认方法后,我们只能声明公共方法,但在抽象类中,我们可以添加公共和私有的抽象方法,所以我们仍然可以将一些逻辑隐藏在抽象类中。想象一下,在实际语言级别上,你只能声明公共方法,任何人都可以改变你的想法,例如Collection。

我同意,并且我想补充一点:请参考“SOLID”原则,它会违反“S”单一职责原则和“I”接口隔离原则。 - pdem
注意:自Java 9版本开始,接口中允许使用私有方法。 - Jean-François Savard
是的,现在Java 8是主要的语言级别 :) - MatWdo

0

因为接口和类是有区别的,它们有不同的意图。接口声明了一个契约。应该谨慎使用接口的默认方法,例如在无法通过向接口添加方法声明来确保兼容性且无法声明xxxV2接口的情况下。

类是表示程序逻辑单元的实体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接