kotlin不可变类
1.概念
kotlin创建的类,如果所有属性值是不可改变的,那这个类就是不可变类。
不可变类属性的值始终维持在初始化状态,因此不可变类很好维护。
2.创建规则
-
提供带参的构造器,用来初始化类中的属性;
-
定义final val只读属性,避免通过setter方法改变该属性值。
有必要的话还可以重写equals方法和hashcode方法,保证equals成立的时候,hash值一致。
注意:如果某个类中,只要有一个属性是可变的(var),那该类就不是不可变类。
/**
* 定义一个不可变类
*/
class MutableClass(val a: String, var b: String)
/**
* 该类是可变类,属性b是可读写属性
*/
class MutableClass(var a: String, var b: String)
3.维持不可变类不可变性质
某些情况下,类定义的属性是不可变属性,但是该属性引用指向的对象本身的属性是可变的,此时若需要维持类的不可变性质,则需要手动做如下处理:①获取该属性时保证获取属性返回后,即使修改了返回对象的属性,也不会影响到该类中的该属性的值;②初始化该属性后,保证即使修改传入的对象的属性,也不会影响到该类该属性的值。
fun main(args: Array<String>) {
val mutableClass = MutableClass("a1", "b1")
val immutableClass = ImmutableClass(mutableClass)
println("a: ${immutableClass.mutableClass.a} b: ${immutableClass.mutableClass.b}")//a1 b1
//此处修改mutableClass对象的值,会影响到ImmutableClass类本身的属性
mutableClass.a = "a2"
mutableClass.b = "b2"
println("a: ${immutableClass.mutableClass.a} b: ${immutableClass.mutableClass.b}")//a2 b2
}
/**
* 该类是可变类,属性a、b是可读写属性
*/
class MutableClass(var a: String, var b: String)
/**
* 定义一个不可变类,因为属性MutableClass本身是可变的,因此,即使使用了val定义属性,该ImmutableClass仍然是可变的
*/
class ImmutableClass(val mutableClass: MutableClass)
上面代码ImmutableClass是可变的,进行下面操作,可保证其为不可变类。
fun main(args: Array<String>) {
val mutableClass = MutableClass("a1", "b1")
val immutableClass = ImmutableClass(mutableClass)
println("a: ${immutableClass.mutableClass.a} b: ${immutableClass.mutableClass.b}")//a1 b1
//此处修改mutableClass对象的值,也不会影响到ImmutableClass类本身的属性
mutableClass.a = "a2"
mutableClass.b = "b2"
println("a: ${immutableClass.mutableClass.a} b: ${immutableClass.mutableClass.b}")//a1 b1
}
/**
* 该类是可变类,属性a、b是可读写属性
*/
class MutableClass(var a: String, var b: String)
/**
* 定义一个不可变类,因为属性MutableClass本身是可变的,但是经过处理之后,该类还是不可变类
*/
class ImmutableClass(mutableClass: MutableClass) {
val mutableClass: MutableClass
get() = MutableClass(field.a, field.b)//获取该属性对象时,新创建一个对象,保证被获取的对象修改后不会影响该类
init {
this.mutableClass = MutableClass(mutableClass.a, mutableClass.b)//初始化该属性时,新创建一个对象,并赋给该属性,保证传入的参数改变后不会影响到该类
}
}