У 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
екземпляри, щоб замість цього створити екземпляри вашого підкласу.
Рішення "скопіювати масив" є більш практичним ... маючи на увазі, що це не справжні фрагменти.
ArrayList
? Я думаю , що ви , можливо , чи не вистачає трохи розуміння того, як інтерфейси працюють , тому щоList
іArrayList
не є «несумісними» -ArrayList
знаряддяList
, і ,List
ймовірно , містить всі необхідні методи вам потрібно.