En Java, es una buena práctica utilizar tipos de interfaz en lugar de clases concretas en las API.
Tu problema es que estás usando ArrayList
(probablemente en muchos lugares) donde realmente deberías usar List
. Como resultado, se creó problemas con la restricción innecesaria de que la lista es unaArrayList
.
Así es como debería verse su código:
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
Su "solución" propuesta al problema fue / es la siguiente:
new ArrayList(input.subList(0, input.size()/2))
Eso funciona haciendo una copia de la sublista. No es una tajada en el sentido normal. Además, si la sublista es grande, realizar la copia será costoso.
Si está limitado por las API que no puede cambiar , de modo que debe declarar inputA
como una ArrayList
, es posible que pueda implementar una subclase personalizada de ArrayList
en la que el subList
método devuelve una subclase deArrayList
. Sin embargo:
- Sería mucho trabajo diseñar, implementar y probar.
- Ahora ha agregado una nueva clase significativa a su base de código, posiblemente con dependencias de aspectos no documentados (y por lo tanto "sujetos a cambios") aspectos del
ArrayList
clase.
- Debería cambiar los lugares relevantes en su base de código donde está creando
ArrayList
instancias para crear instancias de su subclase en su lugar.
La solución "copiar la matriz" es más práctica ... teniendo en cuenta que estos no son cortes verdaderos.
ArrayList
? Creo que puede carecer de un poco de comprensión de cómo funcionan porque las interfacesList
yArrayList
no son “incompatibles” -ArrayList
implementosList
, yList
probablemente contiene todos los métodos necesarios que necesita.