W Javie dobrą praktyką jest używanie typów interfejsów zamiast konkretnych klas w API.
Twoim problemem jest to, że używasz ArrayList(prawdopodobnie w wielu miejscach) miejsca, w którym naprawdę powinieneś używać List. W rezultacie stworzyłeś sobie problemy z niepotrzebnym ograniczeniem, że lista jest ArrayList.
Oto jak powinien wyglądać Twój kod:
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
Twoje proponowane „rozwiązanie” problemu było następujące:
new ArrayList(input.subList(0, input.size()/2))
Działa to poprzez utworzenie kopii podlisty. To nie jest plasterek w normalnym sensie. Ponadto, jeśli podlista jest duża, wykonanie kopii będzie kosztowne.
Jeśli są ograniczane przez API, że nie można zmienić , tak że trzeba zadeklarować inputAjako ArrayList, może być w stanie realizować niestandardową podklasę ArrayList, w których subListmetoda zwraca podklasę ArrayList. Jednak:
- Zaprojektowanie, wdrożenie i przetestowanie wymagałoby dużo pracy.
- Dodałeś teraz znaczącą nową klasę do swojego kodu, prawdopodobnie z zależnościami od nieudokumentowanych aspektów (a zatem „podlegających zmianom”) aspektów
ArrayListklasy.
- Musisz zmienić odpowiednie miejsca w bazie kodu, w których tworzysz
ArrayListinstancje, aby zamiast tego tworzyć instancje swojej podklasy.
Rozwiązanie „kopiuj tablicę” jest bardziej praktyczne… biorąc pod uwagę, że nie są to prawdziwe wycinki.
ArrayList? Myślę, że możesz nie rozumieć, jak działają interfejsy, ponieważListiArrayListnie są „niekompatybilne” -ArrayListimplementująListiListprawdopodobnie zawierają wszystkie niezbędne metody, których potrzebujesz.