装箱的根源是以值传递参数

导致装箱操作这个大麻烦的根源是函数/方法的参数、返回类型是以值的方式(或者说引用的复制品)而不是地址引用的方式传递。装箱操作实际上是一种穿上一层外衣,来执行对确定对象的值进行修改,然后再脱一层外衣(回到原先的形态)的愚蠢行为。换种说法,如果用户需要一个新的复制品,用户自己可以去创建一个新复制品对象,而不应该被编程语言自动的创建新的复制品来传递参数,这是一种强制的额外消耗,也就是说,以值传递参数的方式并没有填补任何未填补的需求(没有产生任何新的作用,仅仅是强制的额外复制)。

C/C++犯了这个错,但是有引用来弥补这个缺陷;C#也犯了这个错,但是有ref和out来弥补这个缺陷。

从C语言开始就出现的反直觉性的传递方式,一直延续到后来,然后才发现装箱操作这个愚蠢的后果。

实际上,消灭指针(*)和引用(&)的最好办法就是以引用的方式传递参数,这是满足了对象的自我功能完整性的形式,不多也不少。换句话说,是由于这个错误方法忽略了本来可以满足的需求而导致产生新的方式来满足这个需求。所以,如果Java能够达成这一点,它就是在这方面上最完美的编程语言。

Java有避免装箱的办法。对于引用:使类对内部对象执行修改;如果可能要重复处理外部传入的对象,则先用一个方法存入内部箱子,再用处理本地对象的方法,这样多次执行也不会造成多次新建箱子的额外消耗,使额外消耗确定在两次:传入参数时自动复制而新建的箱子;建立本地箱子。对于值:使用对象传递参数,例如Integer而不是int。从一致性的角度来看,值对象根本不应该在引用对象处在的层面存在,也就是说,应该统一使用引用对象。

posted @ 2017-08-31 09:24  三叶之二  阅读(115)  评论(0编辑  收藏  举报