版权归作者所有,转发请注明出处://www.greatytc.com/p/fe7ed9b790f8
Kotlin中的inline关键字 - 内联函数
Kotlin中的inline关键字 - 内联类
前言
Kotlin
是一种在 Java
虚拟机上运行的静态类型编程语言,被称之为 Android
世界的Swift
,在Google
I/O 2017中,Google
宣布 Kotlin
成为 Android
官方开发语言
img.jpg
内联函数
被inline
关键字所修饰的类为内联类
内联函数的作用
在 Kotlin中的inline关键字 - 内联函数 中我们了解到内联函数的额作用是节省函数调用的开销,那么内联类的作用就是节省类创建对象的开销,很多时候我们的类只会有一个属性,整个类中提供的都是获取操作此属性的办法,通常情况下我们会这样
inline class CurrentStatus(val value: String) {
fun getStatus() = when (value) {
"Waiting " -> {
0
}
"inProgress" -> {
1
}
"complete" -> {
2
}
else -> {
-1
}
}
}
fun use(){
val status = CurrentStatus("complete")
print(status.getStatus())
}
内联类就会生成类似于这样的代码
class CurrentStatus{
private final String value;
public static int getStatus_Impl(String value){
...
}
}
fun use(){
val status = "complete" //没有进行对象的创建,只是存在被包装的值
print(CurrentStatus.getStatus_Impl(status)) //编译器生成类似的静态函数
}
整个调用过程没有堆对象的产生,节省了对象创建的消耗
使用内联类的条件
内联类必须要有一个主构造函数,并且目前的支持必须有一个val
属性
inline class CurrentStatus() {} //错误
inline class CurrentStatus(var value:String ) {} //错误
inline class CurrentStatus(var value:String,val data:String) {} //错误
inline class CurrentStatus(val value:String) {} //正确
使用内联类定义严格的类型别名
kotlin
中可以使用typealias
定义类型别名
typealias Amount = Double
typealias Percent = Double
fun test() {
var amount: Amount = 0.1
val percent: Percent = 0.15
amount = percent // 可以正常赋值,因为虽然是不同的typealias,但是实际类型是相同的
}
也可以使用内联类进行包装
inline class Amount(val value: Double)
inline class Percent(val value: Double)
fun test() {
var amount: Amount = Amount(0.1)
val percent: Percent = Percent(0.2)
amount = percent // 编译错误,类型不同
}
欢迎关注Mike的简书
Android 知识整理