2017-01-26 3 views
3

Почему в Java 8 появился новый класс Spliterators? Начиная с Java 8, мы можем добавить методы static к интерфейсам. С Spliterators класс имеет только статический метод, было бы проще объявить все его методы в Spliteratorinterface?Почему у нас есть отдельный класс Spliterators в Java 8?

Тот же вопрос о Collectors/Collector пара.

спасибо.

ответ

0

Потому что существует разница между интерфейсом и классом. У этих двух есть разные намерения. Интерфейс объявляет контракт. Методы по умолчанию для интерфейса должны быть тщательно использованы, например, если вы не можете нарушить совместимость, добавив объявление метода в интерфейс и не можете объявить интерфейс xxxV2.

Класс - это объект, который представляет собой единицу программной логики.

2

Нет, это не очень хорошая идея, потому что interface объявляет контракт, но класс представляет собой логику. Но после добавления метода default в interface в Java 8 мы можем объявить только метод public, но в абстрактном классе мы можем добавить абстрактный метод public и private, поэтому мы все же можем скрыть некоторую логику в абстрактных классах. Представьте себе, что на фактическом уровне языка вы можете объявить только метод public, и каждый может изменить вашу идею на e.q. Collection

+0

Я согласен, и я бы добавил: см. Принцип * «SOLID» *, он сломал как принцип * S *: принцип единой ответственности, так и принцип разделения I * интерфейса – pdem

+0

Примечание: частные методы разрешены в интерфейсе, поскольку 9 –

+0

Да, летучая мышь теперь Java 8 является основным языковым уровнем :) – MateuszW90

9

Совершенно возможно, что это решение было принято, даже не задумываясь об этой совершенно новой возможности, а просто следуя установленному шаблону с двадцатью годами.

Кроме того, можно обсудить, действительно ли полезно добавить к интерфейсу от 25 до 30 static методов. Имеет смысл предложить несколько заводов для канонических реализаций, но вы должны нарисовать линию где-нибудь. Невозможно добавить фабрики к всем реализациям интерфейса, просто потому, что они предлагаются одной и той же библиотекой. Но эта дискуссия была бы вне темы.

Кроме того, Spliterators предлагает не только методы static, но и вложенные классы. В отличие от методов static, эти классы будут загрязнять пространство имен каждого класса реализации при определении в interface.

Collectors10 и Spliterators могут также содержать методы, отличные от реализации, а неи даже поля.

+2

рассуждения о загрязнении - это то, что мне больше всего понравилось в вашем ответе. 1+ – Eugene

Смежные вопросы