美文网首页
2020-09-30

2020-09-30

作者: 海东青_fb7a | 来源:发表于2020-10-12 17:26 被阅读0次
  • 复合符号[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()
        }

提升了性能,而且增加的代码量是在编译期执行的,对程序可读性不会造成影响。

相关文章

网友评论

      本文标题:2020-09-30

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