美文网首页
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