Java

Стоит ли использовать Iterable вместо Set?

Допустим, у меня есть статичное множество, в который в будущем я не намерен добавлять ещё элементы. Стоит ли мне в таком случае предпочесть использовать интерфейс Iterable вместо интерфейса Set?

Этот вопрос у меня возник после того, как увидел, что в исходном коде Google Guava (на Github) использовано вместо интерфейса Set интерфейс Iterable.

Я заметил, что для использования Iterable её не надо напрямую импортировать, а для Set — нужен импорт.

Какие преимущества даёт использование Iterable вместо Set?
Те, кто пишут библиотеки, используют в качестве параметров методов самые общие интерфейсы/классы, которые позволяет реализация метода. Для того, чтобы Вы, как пользователь библиотеки, не задумывались над тем, что ваш Set нужно превратить в List или Collection, чтобы передать в гуаву. Вы можете использовать все, что душе угодно и одинаково передавать в методы либы. Т. к. там внутри метода, разработчики либы предусмотрели это и им неважно, что вы по факту передадите - Set, List, Collection, ArrayList, LinkedList, HashSet, TreeSet и т. д. Им достаточно перечисления.
Но использовать Iterable в качестве типа переменных в своем коде? Зачем? Нафига себя так ограничивать-то. Что вы с этим одним методом перечисления делать будете?
АБ
Алексей Булдаков
55 095
Лучший ответ
Ермек Маратович Именно в качестве поля класса использовался этот интерфейс в исходном коде библиотеки. Я думаю, что это было сделано просто для простоты, "чтобы не убивать глаза и мозг программиста разными методами, большую часть которых он не будет использовать"... В любом случае можно изменить Iterable на Set.
Ты любишь по старине проехаться. Гугл сначала написал говнаво, потом долждался Java 8, потом понял что яву уже ничем не спасти и перешли на скотлин и судится с бесплатной явой на миллиарды Ну Iterable это одно а Set совсем совсем другое
Отличаются они логикой использования. Если нужно только перебирать элементы - используется Iterable, если нужна неповторяемость элементов со всеми вытекающими - используется Set, который имеет в том числе функциональность Iterable.
Валера Ситник
Валера Ситник
30 155
Ермек Маратович Мне интересны преимущества.
Преимущество, что в будущем туда можно будет запихнуть любой класс реализующий интерфейс итерабл
(Код не читал)
Ты вообще понимаешь, что такое Set, а что такое Iterable? Как можно сравнивать АБСОЛЮТНО разные вещи, предназначенные для решения разных задач?
Ермек Маратович А вы знаете?
преимущество надо искать в том, как работает сама реализация, если и там и там одно и то же, а Collectors.toSet вернет HashSet, то и там и там у вас HashSet, как не крути, оптимизировать импортами вы ничего не сможете. Если вам нужен Set, а вы в него собираете, то обычно и нужна работа, как с Set, а не как с чем-то Iterable. Иначе тогда почему не собираете с List. Если вы разработчик библиотеки, то вы иногда хотите ограничить пользователя библиотеки в том, что он может делать, если в гуаве так написали, значит хотели чтобы вы просто могли пробежаться по ней циклом for или forEach
Ермек Маратович Конечно, если бы у Iterable была своя уникальная реализация, то это было бы хорошей оптимизацией! Дело меняется, если реализатором становится HashSet, а интерфейсои — Iterable.
Роман Турсуков если бы у Iterable была своя уникальная реализация? Вы о чем, если это базовый интерфейс, только и всего. И никакое дело не меняется, если реализация HashSet, а интерфейс Iterable. Всё всегда так, как и у List и ArrayList, Set и HashSet, Map и HashMap, на этом построенно всё Collection API и куча других библиотек. Меньше методов наружу, только и всего. Но я наверно сделал ошибку, что решил написать на очередной Ваш вопрос, Вы же явно круче разбираетесь во всем, чем я ( Java Dev с 7 летним опытом коммерческой разработки)
P.S. хотя по Вашим вопросам не скажешь, что прям разбираетесь