kotlin 基础 inline class 18

作者: zidea | 来源:发表于2019-04-08 20:39 被阅读7次
kotlin.jpeg

在 kotlin 中对 java 进行优化就是将 java 的 class 进行细分为许多不同 class,在 java 每个类有些附加或者说额外的方法是多数场合是不会被用到的。我们需要不断减轻类的负担。去掉一些额外的方法,从而减少内存分配来提高性能。

inline class Password(val value: String)
inline.jpeg
inline class Animal(val name:String){
    val age:Int
        get() = 5
    fun move(){
        println("moving...")
    }
}

fun main(args: Array<String>) {
    val zidea = EmployeA.create()
    println(zidea.name)

    var password = Password("123")
    println(password.value)

    val cat = Animal("miao")
    println(cat.age)
    println(cat.name)
}

inline 类在运行期可以看做一个包装类或底层类型,底层类型就是类似 int 整型类型

  • inline 类不支持 init 方法
  • inline 类不支持 backing field

问题来了什么是 backing field 呢,在类中定义一个成员变量,Kotlin 会自动生成默认setter/getter方法。而 Kotlin 提供了一种非常特殊的方式声明setter/getter方法

 var name: String? = null
    set(value) {
        field = value
    }
    get() = field

实例化这个类,然后对当前实例的name属性进行赋值并取值。Oops…结果,你会发现,无论是取值还是赋值都出现递归调用。

inline class Animal(val name:String):Imove{
  val age:Int
      get() = age
Exception in thread "main" java.lang.StackOverflowError
  at Animal.getAge-impl(ClientC.kt:18)
  at Animal.getAge-impl(ClientC.kt:18)
  at Animal.getAge-impl(ClientC.kt:18)
  at Animal.getAge-impl(ClientC.kt:18)

backing field的作用域仅仅存在于当前属性的setter/getter方法中,field 就像绑定了当前属性的一样。因此,我认为翻译成备份属性也许更合适

interface Imove{
    fun move()
}

inline class Animal(val name:String):Imove{
    val age:Int
        get() = 5
    override fun move(){
        println("moving...")
    }
}

inline 类在运行期可以看做一个包装类或底层类型,底层类型就是类似 int 整型类型


Learn-a-Programming-Language-Step-24.jpg

相关文章

网友评论

    本文标题:kotlin 基础 inline class 18

    本文链接:https://www.haomeiwen.com/subject/qebuiqtx.html