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)//初始化该属性时,新创建一个对象,并赋给该属性,保证传入的参数改变后不会影响到该类
    }
}
posted @ 2019-05-28 16:54  谢光伟  阅读(401)  评论(0编辑  收藏  举报