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變量的修改,是完全的“換了一個東西”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章