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ć inputA
jako ArrayList
, może być w stanie realizować niestandardową podklasę ArrayList
, w których subList
metoda 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
ArrayList
klasy.
- Musisz zmienić odpowiednie miejsca w bazie kodu, w których tworzysz
ArrayList
instancje, 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żList
iArrayList
nie są „niekompatybilne” -ArrayList
implementująList
iList
prawdopodobnie zawierają wszystkie niezbędne metody, których potrzebujesz.