- 复合符号[Elvis 运算符]
a?.b
if (a != null){
return a.b()
}else{
return null
}
a?:b
if (a != null){
return a
}else{
return b
}
a!!
if (a != null){
return a
}else{
Throw Exception
}
- 单例模式
companion object {
private var INSTANCE: Repository? = null
val instance: Repository
get() {
if (INSTANCE == null) {
synchronized(Repository::class.java) {
if (INSTANCE == null) {
INSTANCE = Repository()
}
}
}
return INSTANCE
}
}
}
-
@JvmOverloads注解
在Kotlin中@JvmOverloads注解的作用就是:
在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。
@JvmOverloads fun f(a: String, b: Int=0, c:String="abc"){
}
相当于
void f(String a)
void f(String a, int b)
void f(String a, int b, String c)
- 在 Kotlin 中,主构造函数无法包含任何代码,因此初始化代码会置于 init 块中。不过,二者功能完全相同。
class Repository private constructor() {
...
init {
val user1 = User("Jane", "")
val user2 = User("John", null)
val user3 = User("Anne", "Doe")
users = ArrayList()
users!!.add(user1)
users.add(user2)
users.add(user3)
}
}
-
Kotlin的inline内联函数
调用一个方法是一个压栈和出栈的过程,调用方法时将栈针压入方法栈,然后执行方法体,方法结束时将栈针出栈,这个压栈和出栈的过程会耗费资源,这个过程中传递形参也会耗费资源。
inline fun <T> check(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
} finally {
lock.unlock()
}
}
然后我们再调用 check 方法,编译器就会在编译期帮我们进行优化:
将我们写的代码 check(lock, {"我是lambda方法体"})
换成
lock.lock()
try {
return "我是lambda方法体"
} finally {
l.unlock()
}
提升了性能,而且增加的代码量是在编译期执行的,对程序可读性不会造成影响。
网友评论