Remove Assignments to Parameters 移除对参数的赋值)
代码对一个参数进行赋值。以一个临时变量取代该参数的位置。
动机
在按值传递的情况下,对参数的任何修改,都不会对调用端造成任何影响。那些用过按引用传递方式的人可能会在这一点上犯糊涂。
另一个让人糊涂的地方是函数本体内。如果你只以参数表示“被传递进来的东西”,那么代码会清晰得多,因为这种用法在所有语言中都表现出相同语义。
在Java中,不要对参数赋值:如果你看到手上的代码已经这样做了,请使用Remove Assignments to Parameters。
当然,面对那些使用“出参数”的语言,你不必遵循这条规则。不过在那些语言中我会尽量少用出参数。
做法
- 建立一个临时变量,把待处理的参数值赋予它。
- 以 “对参数的赋值”为界,将其后所有对此参数的引用点,全部替换为“对此临时变量的引用”。
- 修改赋值语句,使其改为对新建之临时变量赋值。
- 编译,测试。
- 如果代码的语义是按引用传递的,请在调用端检查调用后是否还使用了这个参数,也要检查有多少个按引用传递的参数被赋值后又被使用。请尽量只以return方式返回一个值。如果需要返回的值不止一个,看看可否把需返回的大堆数据变成单一对象,或干脆为每个返回值设计对应的一个独立函数。
Java的按值传递
从本质上说,对象的引用是按值传递的。因此我可以修改参数对象的内部状态,但对参数对象重新赋值是没有意义的。
Java 1.1及其后版本允许将参数标示为final, 从而避免函数中对参数赋值。即使某个参数被标示为final,仍然可以修改它所指向的对象。我总是把参数视为final, 但是我得承认,我很少在参数列表中这样标示它们。