Например, некоторый метод имеет следующую реализацию:Как реализовать реализацию, если входной параметр изменен?
void setExcludedCategories(List<Long> excludedCategories) {
if (excludedCategories.contains(1L)) {
excludedCategories.remove(1L);
}
}
И это называется следующим способом:
setExcludedCategories(Array.asList(1L, 2L, 3L));
Конечно, это приведет к ВЗУ java.lang.UnsupportedOperationException исключения, когда попытается удалить элемент.
Вопрос: как я могу изменить этот код, чтобы убедиться, что входной параметр excludedCategories поддерживает удаление?
UPD: Спасибо за ответы. Подведем итоги:
- Всегда создавайте новый ArrayList из списка входных данных, чтобы убедиться, что он изменен - будет использоваться много бесполезной памяти -> НЕТ.
- Поймать неподдерживаемое исключение.
- Укажите в JavaDoc, что вызывающий объект не должен передавать неизменяемый список - кто-нибудь читает JavaDoc? Когда что-то не работает только :)
- Не используйте Arrays.asList() в коде вызывающего абонента - это вариант, если вы являетесь владельцем этого кода, но в любом случае вы должны знать, разрешает ли этот конкретный метод неизменность или нет (см. 3).
Кажется, что второй вариант - единственный способ решить эту проблему.
Очевидно, я не знаю, что делает ваш код, помимо кода примера, который вы опубликовали, но было бы возможно скопировать данные из параметра и поместить его в измененный список? –
Вам не нужен этот оператор 'if'. Совершенно безопасно и легально удалить что-то из коллекции, даже если ее нет в коллекции. – VGR
Да, это очевидный способ исправить это, но это приведет к дополнительному использованию памяти. Лучшее исправление не позволит вообще передавать неизменяемый список. Поэтому я прошу о возможных способах, как это сделать. –