- 主構造函數裡的參數,如果不聲明為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