Java基本类型(primitive type)为什么是immutable 的讨论

笔者在学习Java设计思想的时候,走进了一个误区,在此进行讨论

我们在讨论immutable和mutable的时候,通常使用String和StringBuilder进行比较,认为每次修改字符串整体的String为immutable,而可以修改内部字符的Builder为mutable,从code snapshot中,容易认为,immutable的类型在修改时,会分配新的内存,创建新的对象,再修改原变量对该空间的引用。而mutable则是不修改原变量指向的空间,直接修改该空间的值。

以上思路在很大程度上是正确的,但是以其讨论primitive type即基本类型时则会遇到一些障碍。在程序申请一个int变量时,Java将如何存储? 如何体现其immutable?

实际上,在很多情况下,int等基本类型会被Java环境直接优化,使用寄存器等方式进行替代。假设我们忽略这些内容,只考虑在程序运行栈中开辟空间保存变量,依旧会发现,很多时候对int等类型的修改是直接修改原变量空间的值,并非 创建新空间 - 赋值 - 修改引用 的流程。

那么就引发了矛盾,为什么primitive变量会被认为是immutable?

实际上,对immutable的定义,更强调一种对本体的认知。假设一个人是一个对象,人的头发是他的一个成员变量,对这个头发的修改并不会导致从一个人变成了另一个人。而考虑int等primitive变量,我们在修改它的值的时候,实际上相当于对该变量本体的认知。将该值修改,整个int就变成了另一个int,就像整个人变成了另一个人,也因此认为对primitive变量的修改,是完全的“换了一个东西”。

发布了90 篇原创文章 · 获赞 65 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ctsnevermore/article/details/104930370
今日推荐