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 , inputA
wie ein ArrayList
, können Sie möglicherweise eine benutzerdefinierte Unterklasse von implementieren , ArrayList
in dem das subList
Verfahren 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
ArrayList
Klasse.
- Sie müssten relevante Stellen in Ihrer Codebasis ändern, an denen Sie
ArrayList
Instanzen 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 , weilList
undArrayList
nicht „unvereinbar“ -ArrayList
GeräteList
, undList
wahrscheinlich enthält alle notwendigen Methoden , die Sie benötigen.