@linux1s1s
2017-01-09T15:44:24.000000Z
字数 1001
阅读 1565
Forward
2017-01
Immutable ---> const
Mutable ---> variable
为了直观理解上面的概念,可以尝试回答下面的问题:
JAVA 中为什么String 是immutable的
先来看看Java代码对应的内存分布:
String string1 = "abcd";
String string2 = "abcd";
内存分布如下:
所以,如上图所示,如果此时改变变量string1的值,string2变量如何变化?
string1 = "defg";
请问string2 变量会随之改变吗?
我们发现string2并没有改变,这就是Immutable的基本特性。
但是如果Java中的String不是Immutable的话,会发生什么?
很显然string1的改变会影响到string2,这就是一例证明Mutable不可控的例证,正如下面的话所说:
Shared mutable state is the root of all evil(共享的可变状态是万恶之源)
-- Pete Hunt
另外在Java中,很多方法的参数都是String型的,如果String是Mutable,那么很容易导致该参数在执行完一段代码以后,发生莫名其妙的改变,其效果等同于下面的一段JS代码
function touchAndLog(touchFn) {
let data = { key: 'value' };
touchFn(data);
console.log(data.key); // 猜猜会打印什么?
}
在不查看 touchFn 的代码的情况下,因为不确定它对 data 做了什么,你是不可能知道会打印什么(这不是废话吗)。但如果 data 是 Immutable 的呢,你可以很肯定的知道打印的是 value。
因此:可变(Mutable)数据耦合了 Time 和 Value 的概念,造成了数据很难被回溯。
所以: Immutable 降低了 Mutable 带来的复杂度
传统的并发非常难做,因为要处理各种数据不一致问题,因此『聪明人』发明了各种锁来解决。但使用了 Immutable 之后,数据天生是不可变的,并发锁就不需要了。
对于Immutable在JS的表现,我们暂且不表,留待后续展开。