Tengo curiosidad por lo que se considera una mejor práctica al devolver una colección de objetos de una clase mutable:¿Cuál es la mejor práctica para devolver una colección interna en Java?
public class Someclass {
public List<String> strings;
public add(String in){ strings.add(in); }
public remove(String in) { strings.remove(in); }
//THIS
public List<String> getStrings(){
return Collections.unmodifiableList(strings);
}
//OR THIS
public List<String> getStrings(){
return new ArrayList(strings);
}
}
Siempre he asumido envolviendo la recolección interna en un inmodificable fue el mejor enfoque, ya que no vi una razón para incurrir en la sobrecarga de crear una copia. Sin embargo, se me ocurrió que cualquier cambio realizado en la lista internamente quedaría expuesto al cliente, lo que me parece malo.
El último enfoque, el uso de ArrayList nuevo, o el uso de .clone(), es el enfoque correcto para reducir los problemas de concurrencia. Collections.unmodifiableList() aumenta los posibles problemas de concurrencia en un entorno de subprocesos múltiples. –