Какова наилучшая практика для изменения объекта, переданного методу

После передачи объекта в метод, я хотел бы изменить одно из его полей. Какая наилучшая практика для выполнения этой задачи в Java?

Ответ 1

Простой ответ

Как указано в других ответах, вы можете просто вызвать метод setter.

Более философский ответ

Как правило, может быть опасно мутировать объекты в области, отличной от той, в которой они были созданы:

http://en.wikipedia.org/wiki/Functional_programming

Тем не менее, часто бывают случаи, когда вы просто хотите инкапсулировать биты логики в одну и ту же логическую область, где вы хотите изменить значения переданного объекта. Поэтому правило, которое я бы использовал, состоит в том, что до тех пор, пока все вызовы код полностью знает о таких мутациях, вы можете вызвать метод setter для объекта (и вы должны создать метод setter, если у вас его нет) в методе, которому вы передаете объект.

В общем случае, если вы вызываете функцию, которая мутирует параметры из нескольких мест в вашей кодовой базе, вы обнаружите, что она становится все более склонной к ошибкам, поэтому функциональное программирование окупается.

Итак, мораль этой истории: если ваш вызывающий (-ы) полностью осведомлен о таких мутациях, вы можете изменить значение в своем методе, но в целом вы должны попытаться избежать этого и вместо этого изменить его в области в котором он был создан (или создать копию).

Ответ 2

Помните, что даже если объект передан как окончательный, он все равно может быть изменен. Вы просто не можете переназначить переменную, которая обычно требуется для параметра (ввода/вывода).

Взяв пример Джигара Джошиса:

public void increasePersonAgeByOneMonth(final Person p ){
  p = new Person(); //this won't work, which is ok since otherwise the parameter itself would not be changed by the next method
  p.setAge(((p.getAge()*12.0) + 1)/12.0); //ok
}