天天看點

kotlin知識點

  • 主構造函數裡的參數,如果不聲明為var或者val,則這個參數一般是用來初始化父類。它不算是這個類的字段,它的作用域隻在主構造函數當中。
  • val 的對象不僅資料不能變, 引用也不能變。
  • //自定義的類似apply功能的頂層函數
    fun <T> T.build(block: T.() -> Unit): T {
      block()
      return this
    }
    //第一個T代表這個函數是泛型, 第二個T代表這個build函數是T這個類的擴充函數, 第三個T代表我傳進去的函數類型的參數具有T這個類的上下文,第四個T代表函數傳回類型是T
          
  • 像工具類這種功能,在kotlin中推薦用“單例類來實作”,但如果确實想要實作類似與類方法(靜态方法)的方法的話:
    class Example{
    ...
    ...
     companion object {
      @JvmStatic
      fun doAction(){
      ....
    }
    
    }
    
    }
    //Example.doAction()      
    第二種方法則是使用“頂層方法”
  • fun <T>later(block:() -> T) = Later(block)//封裝的頂層函數
    
    //滿足實作懶加載的類
    class Later<T>(val block:() -> T) {
        var value: Any? = null
    
        operator fun getValue(any :Any?, prop:KProperty<*>):T{
            if(value == null){
                value = block()
            }
            return value as T
        }
    }
    
    val p by Later<Int> {//第一種直接使用類的方法
        println("make when run")
        123
    }
    
    val q by later {//使用包裝成了頂層函數的方法
        println("make when run too")
        "hello?"
    }
    fun main(){
        println("-----")
        println(p)
        println(p)
        println(q)
        println(q)
    }
    
    
    -----
    make when run
    123
    123
    make when run too
    hello?
    hello?      
  • 如何去除 原生字元串 的前導空格
    val withoutMargin1 = """
                |ABC
                    |123
                    |456""".trimMargin()
            println(withoutMargin1)
    
            val withoutMargin2 = """
                    XYZ
                    foo
                    bar
                 """
    
    
            println(withoutMargin2)      
  • 編譯時常量隻能在函數(指包括 main 在内的所有函數)之外定義。這是因為,編譯時常量 必須在編譯時(程式編譯時)指派,而 main 和其他函數都是在運作時(程式運作時)才調用, 函數内的變量也是在那時指派。編譯時常量要在這些變量指派前就已存在。 因為使用複雜的資料類型可能會危害編譯時的安全保障,是以編譯時常量隻能是一些常見的 基本資料類型。第 13 章會介紹資料類型建構的相關知識。以下是編譯時常量支援的基本資料類型:  String  Int  Double  Float  Long  Short  Byte  Char  Boolean