Ответ 1
В Java рекомендуется использовать типы интерфейсов, а не конкретные классы в API.
Ваша проблема в том, что вы используете ArrayList
(возможно, во многих местах), где вы действительно должны использовать List
. В результате вы создали проблемы для себя с ненужным ограничением, чтобы список был ArrayList
.
Вот как выглядит ваш код:
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
Ваше предлагаемое "решение" проблемы было/есть следующее:
new ArrayList(input.subList(0, input.size()/2))
Это работает, сделав копию подписок. Это не ломтик в нормальном смысле. Кроме того, если подсписчик большой, то создание копии будет дорогостоящим.
Если вы ограничены API, которые вы не можете изменить, так что вы должны объявить inputA
как ArrayList
, вы можете реализовать собственный подкласс ArrayList
, в котором возвращается метод subList
подкласс ArrayList
. Однако:
- Было бы много работы по проектированию, внедрению и тестированию.
- Теперь вы добавили к своей базе кода значительный новый класс, возможно, с зависимостями от недокументированных аспектов (и, следовательно, "подверженных изменениям" ) аспектов класса
ArrayList
. - Вам нужно будет изменить соответствующие места в вашей кодовой базе, где вы создаете экземпляры
ArrayList
, чтобы создавать экземпляры вашего подкласса.
Решение "скопировать массив" более практично... учитывая, что это не истинные срезы.