У меня есть метод, который принимает несколько аргументов, некоторые из этих аргументов будут изменены внутри метода. Некоторые из них используются только для чтения. Клиент (другие части кода, вызывающие такой метод) предоставляет экземпляры объектов в качестве аргументов.Конструкции языка Java, указывающие, что аргумент не будет мутирован?
Какие существуют конструкции языка Java, которые позволяют мне заявить, что аргумент не должен или не будет или не может быть мутирован внутри метода. Constrcuts как аннотации или ключевые слова, которые говорят клиенту, что метод не будет изменять экземпляры объектов, используемые в качестве аргументов в вызове метода. Также создаются конструкции, которые генерировали бы ошибки компиляции или предупреждение в случае, если я (как разработчик такого метода) попытаюсь случайно мутировать объект внутри реализации метода.
Я знаю о ключевом слове final
, но это только для того, чтобы ссылка не обновлялась.
Неизменность - это не решение, как в других методах (или где-либо еще в моем приложении). Я хочу, чтобы экземпляры типа изменялись, только внутри этого вызова метода я хочу дать «обещание» клиенту , что я не буду изменять свой экземпляр, предоставленный в качестве аргумента.
Глубокое копирование или клонирование аргумента или разрешение клиенту (вызывающему) сделать такую вещь не требуется, так как она не является частью логики метода, чтобы каким-либо образом изменить экземпляр. Я просто хочу узнать, поможет ли язык двойной проверки, этого не произойдет.
Вы можете сделать глубокую копию и передать это. – John
Один грязный способ - использовать [StackTraceElement] (http://stackoverflow.com/questions/421280/how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection) для извлечения последнего вызываемого метода/класса. Вы можете создать исключение ('UnsupportedOperation'?), Если вызов этого метода (метод setter) был выполнен из * неприемлемого контекста *. На самом деле я не думаю, что это хорошая идея: P – TheLostMind