Существует несколько подходов к остановке метода, вносящего изменения в объект, переданный в качестве параметра:
- Сделайте копию объекта и передайте копию. Существует множество способов копирования объектов. Конструкторы копирования и статические фабричные методы, вероятно, лучше, чем реализация
clone()
.
- Создайте класс-оболочку только для чтения для класса объекта, создайте его экземпляр и передайте его. Оболочка только для чтения либо не предоставляет методы обновления, либо реализует их, ничего не делая, либо генерирует исключения.
- Выполните рефакторинг API объекта, чтобы он имел интерфейс только для чтения и интерфейс чтения-записи, и передайте его как экземпляр первого. (Конечно, вызывающий может попытаться привести его к последнему ...)
- Использование безопасности Java для предотвращения нежелательных обновлений. (Это дорого и сложно ...)
Конечно, если объект, который вы пытаетесь «защитить», имеет глубокую структуру, в которую вы хотите предотвратить изменения, тогда вам нужно убедиться, что вы справляетесь с этим; например путем глубокого копирования, путем возврата копий компонентов или возврата их в обертке и т. д.
Большинство вышеперечисленных подходов увеличивают сложность и затраты времени выполнения, поэтому я советую избегать конструкций, в которых требуется для выполнения подобных задач. Если это возможно, просто задокументируйте, что объект должен обрабатываться только для чтения, и оставьте это на усмотрение человека, который кодирует метод, чтобы делать правильные вещи.
Например, общеизвестно, что вы не должны изменять состояние объекта, используемого в качестве ключа в Map
, таким образом, чтобы его значение изменялось. Однако, обычно ничего не делают, чтобы попытаться «навязать» это; то есть использовать изменяемые объекты в качестве ключей ... и просто не изменять их.