4. 副作用
在一些语言如Pascal中,子程序被分成两种:函数和过程。虽然Java没有强制性地要求将方法区分为命令和函数,然而这种区别对于良好地设计程序有很大的帮助[1]。
首先说明一个概念:副作用(side effect)。副作用一般是针对操作(表达式)而言的,一个操作/表达式有“副作用”是指在对该表达式求值时,会改变程序的一个或多个数据,以致再次对该表达式求值时,可能会得出不同的结果。事实上,Java的4种表达式语句如赋值、自增自减、方法调用、对象创建都可能带来副作用。
这里讨论方法的副作用。一个方法的执行,如果在返回一个值之外还导致某些外部“状态”发生变化,则称该方法产生了副作用。这里所谓“状态”发生变化,可以是实例域或静态变量被修改、方法的实参被修改(Java 中不会出现这种情况。但是实参为引用时,其指向的对象可能被修改从而产生副作用)、将数据传递给显示器、打印机或存入文件中等等。
当然,方法内部的表达式也会出现副作用,如果它仅仅影响局部变量而不影响外部状态,则方法没有副作用。基于副作用概念,定义两个术语:
² 有返回值而且没有副作用的方法称为函数(function)。
² 没有返回值的方法必然有副