Mutability and Immutability
在java数据属性值进行改变时,有些类改变了它的具体指向,有些类改变了它具体指向的值:而改变一个变量、改变一个变量的值,二者有何区别?
改变一个变量:将该变量指向另一个值的存储空间
改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。
1.Immutability 不变性
不变数据类型:一旦被创建,其值不能改变。
而实际上,其值不能改变的意思是只它的指向空间的值不能改变,而并未说不能改变这个数据类型的指向。也就是说,即使我们不改变其储存空间的值,也有办法改变这个数据类型的值,即改变它的指向即可。
为说明这个过程,我在eclipse中用一个简单的代码举例:
先对这个代码进行解析思考,再看最后的结果。
再这个代码中,我们定义了字符串a、b,且b是指向a改变前指向的储存空间就的一个字符串,即如果String是一个Immutability数据类型,则a的改变结果应该是新建了一个储存空间存储“1234”且让a指向了这个储存空间。因此,b的值应该并没有发生改变:从而得到运行结果如下图所示。
故推测正确,且String是一个Immutability数据类型。
图解为下图例子所示:
2.Mutability 可变性
如int类、StringBuilder类等,都为可变类。即可以改变该对象指向的储存空间的值。我们继续用之前的代码例子来进行说明。
如图所示,我们在字符串改变处进行代码更改,因为我们想要验证指向同一个空间的数据是否会因为一个数据的更改而影响其他数据的值。由于指向一个空间,此时我们改变b的值,应该会使a的值发生改变,从而我们来看这一段代码的运行结果。
结果如我们所料,也就很好的解释了有关Mutability数据的真实面目。
再对此进行图解,为了更好的理解,如下图所示:
3.可变性以及不可变性所带来的问题
考虑到函数的返回值问题,就不得不考虑一个有关是否安全的问题了。这也是大多数程序员在编程时所要面临的重要问题。
在此介绍一个应用起来作为简单的方式:由于Immutability所指向空间的值并不会发生改变,即当以Immutability类型数据作为返回值时不用担心有人使用非法手段通过返回值对你的程序进行进攻。因此,主要防范的是当以Mutability类型数据作为返回值时应该怎么进行处理。用一个最简单且通用的办法,即在返回之前对这个对象new一个新的与他存储内容相同但指向地址不同的对象。通过这种方式,防止了这个类中固有的private属性的泄露,更好的保护了程序的安全性。