Я не думаю, что есть простой ответ "наилучшей практики" на это.Это действительно зависит от того, сколько ресурсов машины вы готовы потратить на предотвращение нарушения границ абстракции данных классов.И это зависит от того, какие риски вы на самом деле пытаетесь смягчить;например, это простые (не параллельные) ошибки, ошибки параллелизма или утечки информации.
Возможны следующие варианты:
- Ничего не делать;т.е. возвращать коллекцию как есть.
- Возвращать коллекцию, завернутую в неизменяемый класс-оболочку.
- Возвращать поверхностную копию коллекции.
- Возвращать глубокую копиюcollection.
Помимо прямых затрат на копирование, другими факторами, связанными с производительностью, являются использование памяти и генерация мусора, а также влияние на параллелизм.Например, если несколько потоков обновляют коллекцию и / или «получают» ее, то создание копии коллекции обычно включает ее блокировку ... что потенциально может сделать операцию узким местом параллелизма.
В заключениеВам необходимо сбалансировать влияние затрат / производительности на потенциальные или фактические риски и затраты, связанные с несоблюдением мер предосторожности.