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

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 整型类型

网友评论