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. En este momento tengo algo como esto:¿Es mejor usar Lista o Colección?
public List<SomeDataType> getData() {
return this.data;
}
public void setData(List<SomeDataType> data) {
this.data = data;
}
¿Quiere decir esto que he permitido que los detalles de implementación interna se escapen? ¿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);
}
Una cosa a tener en cuenta es que si devuelve la colección o lista actual, está permitiendo que otra persona haga lo que quiera, incluso eliminar elementos o incluso borrar todo. Puede ser mejor devolver un contenedor no mutable o una copia de la lista. –
@PaulTomblin cierto, pero es un poco excesivo y artificial para el sistema. Los envoltorios no modificables tienen sentido cuando se trabaja con objetos administrados por middleware de persistencia, y aun así solo en casos raros. – comeGetSome
@comeGetSome, es por eso que dije "puede" en lugar de "debo". Dependería del caso de uso: si estuviera haciendo una API para que otros la usen, devolvería una copia o un contenedor. Si fuera para mí o para colegas de confianza, colocaría un gran "NO MODIFICAR ESTE VALOR" en los javadocs y lo dejaría así. –