kotlin 基础 inline class 18

作者 : 开心源码 本文共1259个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共197人阅读

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

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » kotlin 基础 inline class 18

发表回复