java - objects - ¿Es mejor usar List o Collection?
sort arraylist object java (8)
Al devolver una implementación de una interfaz o clase que está en una jerarquía alta, la regla de oro es que el tipo de devolución declarada debe ser el nivel MÁS ALTO que proporciona la funcionalidad mínima que está preparado para garantizar a la persona que llama, y que la persona que llama razonablemente necesita Por ejemplo, supongamos que lo que realmente devuelve es una ArrayList. ArrayList implementa List and Collection (entre otras cosas). Si espera que la persona que llama necesite usar la función get (int x), no funcionará devolver una Colección, necesitará devolver una Lista o ArrayList. Siempre que no vea ninguna razón por la cual alguna vez podría cambiar su implementación para usar algo que no sea una lista, digamos un conjunto, entonces la respuesta correcta es devolver una lista. No estoy seguro de si hay alguna función en ArrayList que no esté en la Lista, pero si la hay, se aplicará el mismo razonamiento. Por otro lado, una vez que devuelve una Lista en lugar de una Colección, ahora ha bloqueado su implementación hasta cierto punto. Mientras menos pongas en tu API, menos restricciones pondrás en futuras mejoras.
(En la práctica, casi siempre devuelvo una Lista en tales situaciones, y nunca me ha quemado. Pero probablemente debería devolver una Colección).
Tengo un objeto que almacena algunos datos en una lista. La implementación podría cambiar más adelante y no quiero exponer la implementación interna al usuario final. Sin embargo, el usuario debe tener la capacidad de modificar y acceder a esta colección de datos. Actualmente tengo algo como esto:
public List<SomeDataType> getData() {
return this.data;
}
public void setData(List<SomeDataType> data) {
this.data = data;
}
¿Esto significa que he permitido que se filtren los detalles de la implementación interna? ¿Debo hacer esto en su lugar?
public Collection<SomeDataType> getData() {
return this.data;
}
public void setData(Collection<SomeDataType> data) {
this.data = new ArrayList<SomeDataType>(data);
}
Depende de qué garantías desee proporcionar al usuario. Si los datos son secuenciales de modo que el orden de los elementos sea importante y permita duplicados, utilice una lista. Si el orden de los elementos no es importante y los duplicados pueden o no estar permitidos, entonces use una colección. Como en realidad está devolviendo la colección subyacente, no debe tener una función de obtención y establecimiento, solo una función de obtención, ya que la colección devuelta puede estar mutada. Además, proporcionar una función de conjunto permite que el usuario cambie el tipo de colección, mientras que usted probablemente desee que el tipo particular sea controlado por usted.
Devolver una lista está en línea con la programación a la interfaz más alta adecuada.
Devolver una colección causaría ambigüedad al usuario, ya que una colección devuelta podría ser: Establecer, Lista o Cola.
Independientemente de la capacidad de indexar en la lista a través de List.get (int), ¿los usuarios (o usted) tienen la expectativa de que los elementos de la colección se encuentran en un orden confiable y predecible? ¿Puede la colección tener múltiplos del mismo artículo? Ambas son expectativas de listas que no son comunes en colecciones más generales. Estas son las pruebas que uso al determinar qué abstracción exponer al usuario final.
Sí, su primera alternativa incluye detalles de implementación de fuga si no es parte de su contrato de interfaz que el método siempre devuelva una lista. Además, permitir que el código de usuario reemplace su instancia de colección es algo peligroso, porque la implementación que pasan puede no comportarse como espera.
Por supuesto, todo es cuestión de cuánto confías en tus usuarios. Si tomas la filosofía de Python de que "todos consentimos adultos aquí", entonces el primer método está bien. Si crees que tu biblioteca será utilizada por desarrolladores inexpertos y necesitas hacer todo lo posible para "cuidarlos" y asegurarte de que no hacen algo mal, entonces es preferible no dejarlos establecer la colección y ni siquiera regresar. la colección real En su lugar, devuelva una copia (superficial) de la misma.
Si me preocupaba ocultar la representación interna de mis datos a un usuario externo, usaría XML o JSON. De cualquier manera, son bastante universales.
Simplemente depende, ¿quieres que tus usuarios puedan indexar los datos? Si es así, use List. Ambas son interfaces, por lo que no está filtrando detalles de implementación, realmente, solo necesita decidir la funcionalidad mínima necesaria.
Usar el tipo más general, que es Colección, tiene más sentido a menos que haya alguna razón explícita para usar el tipo más específico: Lista. Pero haga lo que haga, si se trata de una API para el consumo público, tenga en cuenta en la documentación lo que hace; si devuelve una copia superficial de la colección, dígalo.