今天看《冒号学堂》的时候,看到里面又提到了关于设计语言的传值方式的问题,我记得大概一两年前我就写过类似的东西,里面也讨论了java的传值方式的问题。时至今日,再次看到这个问题的时候,又有了一些别的理解。
现在java8已经比较流行了,其中最大的亮点大概就是支持了函数式编程,lambda以及function。这就让我们联想到,究竟什么是函数式编程?如果说java8才支持函数式编程,那java8以前算是什么编程呢?不要着急,以下是我的一些个人理解,在这里写下来。
函数大概大家都知道是什么,其实所谓函数式编程就是要大家像编写函数一样去编程。函数的特点是什么呢?最最重要的就是无副作用。什么叫无副作用呢?就像我们写的数学函数一样,我们的输入一定,输出肯定是一样的!比方说我们定义了一个新的运算规则函数,输入两个自然数,输出一个自然数。比方说输入1和9,会输出11,现实当中会由于我多次调用这个函数,然后我输入1和9,输入就变成了12吗?绝对不会!说来也算惭愧,其实我们经常写的代码就会有这种类似的问题。java是在2014年才正式支持这个特性。java8之前也算是铁杆的命令式编程语言吧,但是现在随着硬件水平的提高,命令式编程语言的优点不是那么明显了,相反函数式编程更加适合这个多核高并发的时代,所以最为流行语言的佼佼者,java也不得不跟随时代的潮流,支持函数式编程的特性。
说了这多,跟文章的开头貌似已经偏离了,但是真正的才在这里。众所周知,java传递参数的方式是“值传递”,所谓值传递就是copy一份参数的值传给方法。网上有无数的文章说明了:如果参数是基本变量,无论方法内如何对这个变量赋值,是不能修改这个变量的值的;如果是引用变量,倒是可以修改引用对应实体的参数的值。java是如何实现的,以及内部是怎么处理的,咱们不在这里讨论(这里有一片不错的文章http://blog.csdn.net/javazejian/article/details/51192130大家可以去这里看)。我这里想说的是,java为什么这样设计呢?改变入参会有什么问题吗?细心的人已经看出来了,就如同我上面对函数式编程做的铺垫一样,java其实也是想规避程序员写出的代码出现上述情况,所以这个算不算java在设计之初就借鉴了函数式编程的思想呢?或者本来没有什么命令式和函数式之分,语言的发展演变就是这样的呢?5年以后的java还会和命令式有多少联系呢?
parameter-passing
如果感到快乐,你就拍拍手。