Я пишу библиотечный метод, который будет использоваться в нескольких местах. Один из параметров метода - это набор объектов, и метод не изменяет эту коллекцию. Следует ли в сигнатуре метода указывать изменяемую или неизменяемую коллекцию?
Вариант 1: изменяемая коллекция в качестве параметра
public static void foo(List<Bar> list) {
// ...
}
Плюсы: клиенты могут передавать в зависимости от того, какое из List<Bar>
или ImmutableList<Bar>
больше им удобно.
Минусы: Не сразу видно, что параметр list
не будет видоизменен. Клиенты должны прочитать документацию и / или код, чтобы понять это. В любом случае клиенты могут делать ненужные защитные копии.
Вариант 2: неизменяемая коллекция в качестве параметра
public static void foo(ImmutableList<Bar> list) {
// ...
}
Плюсы: у клиентов есть гарантия, что параметр list
не будет изменен.
Минусы: если у клиента есть List<Bar>
, они должны сначала преобразовать его в ImmutableList<Bar>
перед вызовом foo
. Это преобразование занимает немного времени, и оно принудительно для клиентов, нравится им это или нет.
Примечание. Для целей этого вопроса давайте предположим, что все клиенты будут иметь доступный ImmutableList
Guava, например, потому что библиотека и клиентский код все принадлежат той же кодовой базе, которая уже использует ImmutableList
в другом месте.