【Kotlin】高阶函数用法二 - 延时初始化+密封类

【Kotlin】高阶函数用法(二)

  • 延时初始化
  • 密封类

学而不思则罔,思而不学则殆

延时初始化

告诉编译器,该对象会在后面对它进行初始化

关键字:lateinit
必须结合var使用,不能是val
使用之前一定要确定已经初始化,否则会抛出异常

class Group() {
    private lateinit var student: Student 
    private lateinit var iCar: ICar

    constructor(brand: String, name: String, age: Int) : this() {
        student = Student(name, age)
        iCar = Car(brand)
    }

    fun show(): Unit {
        student?.sleep() //不好的操作,不用?判断处理
        iCar?.startUp()  //不好的操作,不用?判断处理
        iCar?.stop()     //不好的操作,不用?判断处理

        student.sleep()
        iCar.startUp()
        iCar.stop()
        println("student=$student car=$iCar")
    }
}

你在没有初始化之前调用会抛出异常UninitializedPropertyAccessException

    constructor(brand: String, name: String, age: Int) : this() {
        student.sleep()
        student = Student(name, age)
        iCar = Car(brand)
    }
Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property student has not been initialized
	at learning.data.Group.<init>(Group.kt:8)
	at learning.HelloWorldKt.main(HelloWorld.kt:11)
	at learning.HelloWorldKt.main(HelloWorld.kt)

确定对象是否已经初始化

    constructor(brand: String, name: String, age: Int) : this() {
        if (!::student.isInitialized){
            println("has not isInitialized")
            student = Student(name, age)
            iCar = Car(brand)
        }

        if (::student.isInitialized){
            println("has isInitialized")
        }
    }
has not isInitialized
has isInitialized

密封类

关键字:sealed class

sealed class IFruit
class Apple(val name: String) : IFruit()
class Orange(val name: String) : IFruit()
class Banana(val name: String) : IFruit()
  1. 密封类及其所有子类只能定义在同一文件的顶层位置,不能嵌套在其它类中
  2. 密封类用来表示受限的类继承结构:当一个值为有限几种的类型、而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展
  3. 枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例
  4. 扩展密封类子类的类(间接继承者)可以放在任何位置,而无需在同一个文件中
  5. 使用密封类的关键好处在于使用 when 表达式 的时候,如果能够验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句了。当然,这只有当你用 when 作为表达式(使用结果)而不是作为语句时才有用

你可能感兴趣的:(Kotlin)