Voté por su respuesta aceptada y de acuerdo con ella - sin embargo, podría yo darle algo a tener en cuenta?
No devuelva una colección directamente. Haga una clase lógica de negocios con un nombre preciso que refleje el propósito de la colección.
La principal ventaja de esto viene del hecho de que no puede agregar código a las colecciones así que siempre que tenga una "colección" nativa en su modelo de objetos, SIEMPRE tenga un código de soporte no OO distribuido en todo su proyecto para acceder eso.
Por ejemplo, si su colección era facturas, probablemente tenga 3 o 4 lugares en su código donde repitió las facturas impagas. Podría tener un método getUnpaidInvoices. Sin embargo, el poder real aparece cuando comienzas a pensar en métodos como "payUnpaidInvoices (pagador, cuenta);".
Cuando transfiere colecciones en lugar de escribir un modelo de objetos, nunca se le ocurrirán clases completas de refactorizaciones.
Tenga en cuenta también que esto hace que su problema sea particularmente agradable. Si no quiere que las personas cambien las colecciones, su contenedor no debe contener mutantes. Si luego decide que en un solo caso TIENE que modificarlo, puede crear un mecanismo seguro para hacerlo.
¿Cómo resolver ese problema cuando se está pasando alrededor de una colección nativa?
Además, las colecciones nativas no se pueden mejorar con datos adicionales. Lo reconocerá la próxima vez que descubra que pasa (Colección, Extra) a más de uno o dos métodos. Indica que "Extra" pertenece con el objeto que contiene tu colección.
Es posible que también desee ver [readonlycollection-or-ienumerable-for-exposing-member-collections /] (http://stackoverflow.com/questions/491375/readonlycollection-or-ienumerable-for-exposing-member- colecciones/491591 # 491591) – nawfal