In Java empfiehlt es sich, in APIs eher Schnittstellentypen als konkrete Klassen zu verwenden.
Ihr Problem ist, dass Sie ArrayList(wahrscheinlich an vielen Orten) verwenden, wo Sie wirklich verwenden sollten List. Infolgedessen haben Sie Probleme mit einer unnötigen Einschränkung erstellt, dass die Liste eine ist ArrayList.
So sollte Ihr Code aussehen:
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
Ihre vorgeschlagene "Lösung" für das Problem war / ist:
new ArrayList(input.subList(0, input.size()/2))
Das funktioniert, indem eine Kopie der Unterliste erstellt wird. Es ist keine Scheibe im normalen Sinne. Wenn die Unterliste groß ist, ist das Erstellen der Kopie außerdem teuer.
Wenn Sie durch APIs eingeschränkt sind , dass Sie nicht ändern können , so dass Sie zu haben , zu erklären , inputAwie ein ArrayList, können Sie möglicherweise eine benutzerdefinierte Unterklasse von implementieren , ArrayListin dem das subListVerfahren eine Unterklasse von zurückgibt ArrayList. Jedoch:
- Das Entwerfen, Implementieren und Testen wäre viel Arbeit.
- Sie haben Ihrer Codebasis jetzt eine bedeutende neue Klasse hinzugefügt, möglicherweise mit Abhängigkeiten von undokumentierten Aspekten (und daher "Änderungen vorbehalten") der
ArrayListKlasse.
- Sie müssten relevante Stellen in Ihrer Codebasis ändern, an denen Sie
ArrayListInstanzen erstellen, um stattdessen Instanzen Ihrer Unterklasse zu erstellen.
Die Lösung "Copy the Array" ist praktischer ... wenn man bedenkt, dass dies keine echten Slices sind.
ArrayList? Ich denke , man kann ein wenig Verständnis fehlt , wie Schnittstellen arbeiten , weilListundArrayListnicht „unvereinbar“ -ArrayListGeräteList, undListwahrscheinlich enthält alle notwendigen Methoden , die Sie benötigen.