《编程导论(Java)·3.1.2 方法》之 副作用
4. 副作用
在一些语言如Pascal中,子程序被分成两种:函数和过程。尽管Java没有强制性地要求将方法区分为命令和函数。然而这样的差别对于良好地设计程序有非常大的帮助[1]。
首先说明一个概念:副作用(side effect)。副作用通常是针对操作(表达式)而言的,一个操作/表达式有“副作用”是指在对该表达式求值时,会改变程序的一个或多个数据,以致再次对该表达式求值时。可能会得出不同的结果。其实。Java的4种表达式语句如赋值、自增自减、方法调用、对象创建都可能带来副作用。
这里讨论方法的副作用。一个方法的运行,假设在返回一个值之外还导致某些外部“状态”发生变化,则称该方法产生了副作用。这里所谓“状态”发生变化,能够是实例域或静态变量被改动、方法的实參被改动(Java 中不会出现这样的情况。可是实參为引用时,其指向的对象可能被改动从而产生副作用)、将数据传递给显示器、打印机或存入文件里等等。
当然,方法内部的表达式也会出现副作用。假设它只影响局部变量而不影响外部状态,则方法没有副作用。基于副作用概念。定义两个术语:
² 有返回值并且没有副作用的方法称为函数(function)。
² 没有返回值的方法必定有副作用,除非它的方法体是空的或者方法没有意义。所以,没有返回值的方法、有返回值但有副作用的方法称为过程(procedure)或命令(command)。
简言之。有副作用的方法称为过程。
如此严格地定义出函数的概念,是由于函数使得系统的状态稳定,函数的行为easy预測。
更进一步,假设函数是纯粹的函数(pure function,纯函数)——它的输出值依靠和只依靠其输入、对于同样的输入总是返回同样的值,(由于纯函数的纯粹和无副作用)对纯函数的调用就行被一个值代替(或者说,将方法视为一个值),这就是函数式编程语言中著名的引用透明(referentialtransparency)特性。
例程 3‑3纯函数 package semantics.method; public class SideEffectsDemo{ private static int x = 0; //纯函数(pure function) public static int times(int i,int j){ return i * j ; } //非纯函数 public static int m(int i,int j){ return i * j +x; } }
在函数式编程语言(functionalprogramming language)如Haskell[2]中,尤其强调避免副作用。
当然了,全然不产生副作用的编程语言是没有不论什么用处的。比如数据显示和存入文件等等副作用都是必要的。强调无副作用的Haskell 语言。使用一种技术将它们分离出来,用一种安全的方式单独运行。
Java是命令式面向对象语言,但可以借鉴函数式语言的长处,也期待Java中增加重要的函数式语言的特性。随着Java 8的公布,引入的λ表达式(Lambda Expressions)表明。Java開始大力引入函数式语言的特性。(They enable you to treat functionality as a method argument, or code as data.)
练习3-5:何谓方法、函数、纯函数? 解释副作用的含义。 |
练习3-6:实现方法,求f(x)=x^3 + 3x+1。注:书中x^3表示x*x*x. |
相关文章
- Java常用类库--定时调度(Timer、TimerTask)
- JAVA 注解教程(四)Java 预置的注解
- Java 容器 & 泛型:六、容器讲到为什么要使用泛型
- Java实现 LeetCode 822 翻转卡片游戏(暴力)
- Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
- Java实现 LeetCode 643 子数组最大平均数 I(滑动窗口)
- java实现第六届蓝桥杯隔行变色
- Java实现 蓝桥杯VIP 算法提高 质数的后代
- 【JAVA】Java 异常中e的getMessage()和toString()方法的异同
- [Java Spring] Controlling API Exposure & Override Endpoint Name
- linux系统部署Java程序获取ip时报Caused by: java.net.UnknownHostException: XXXXXXXXXX: XXXXXXXXXX: Name or service not known
- 二进制兼容原理 - C/C++ &Java
- Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725
- 华为OD机试 - 上班之路(Java & JS & Python)
- 华为OD机试 - 任务总执行时长(Java & JS & Python)
- 华为OD机试 - 冗余覆盖(Java & JS & Python)
- 华为OD机试 - 区间交叠问题(Java & JS & Python)
- 华为OD机试 - 求符合要求的结对方式(Java & JS & Python)
- 华为OD机试 - 约瑟夫问题(Java & JS & Python)
- 华为OD机试 - 数组去重和排序(Java & JS & Python)
- How to improve Java's I/O performance( 提升 java i/o 性能)
- java移位运算符实验程序:<<(左移)、>>(带符 号右移)和>>>(无符号右移)
- 详解打印流PrintStream&Java中格式化输出的几种方法
- Java List toArray(new String[0]) 的理解&List的toArray()方法详解
- Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释
- 《一切皆是映射:代码的本质》Java 动态读取源代码,并编译 & 加载执行
- 多种方法解决Error querying database. Cause: java.sql.SQLException: No value specified for parameter 1
- java 接口和抽象类的区别
- 摸索出来的chrom调试前后台数据(Java&&Ajax)交互的方法分享一下咯!!!
- JAVA架构图的设计与画法
- Java面试题整理(附参考答案)
- JAVA开发讲义(二)-Java程序设计之数据之谜二