??本項(xiàng)目總結(jié)了 Kotlin 幾乎全部的知識(shí)點(diǎn),代碼中有詳盡的注釋,用以幫助理解靶擦。本人主要參考了 Kotlin 語(yǔ)言中文站再膳、Kotlin 教程 | 菜鳥教程 中的代碼示例乡小。部分知識(shí)難點(diǎn)如:委托模式、注解饵史、反射满钟,通過(guò)查閱《Kotlin實(shí)戰(zhàn)》進(jìn)行了相關(guān)總結(jié),歡迎大家一起研究學(xué)習(xí)胳喷。
項(xiàng)目地址:https://github.com/CelebrateG/KotlinWithNotes
kotlin委托的栗子
??委托是Kotlin中最獨(dú)特和最強(qiáng)大的功能之一湃番,下面是項(xiàng)目中的兩個(gè)例子,
Example1:
/**
* @Author CelebrateG
* @Description 委托模式:操作的對(duì)象不用自己執(zhí)行,而是把工作委托給另一個(gè)輔助對(duì)象
* 類委托吭露,kotlin 通過(guò) by 關(guān)鍵字將接口實(shí)現(xiàn)委托給另一個(gè)對(duì)象
*/
interface AnotherInterface{
val message: String
fun printSomething()
fun printMessage()
}
/**
* 接口實(shí)現(xiàn)類
* 即受委托的類
*/
class Impl(val x : Int) : AnotherInterface{
override val message = "Impl: x = $x"
override fun printMessage() {
println("printMessage: $x")
}
override fun printSomething() {
println("printSomething: $x")
}
}
/**
* by 關(guān)鍵字將接口的實(shí)現(xiàn)委托給了 i
* 委托對(duì)象 i 為 Derived 的構(gòu)造參數(shù)
*/
class Derived(i : Impl) : AnotherInterface by i
/**
* 委托給 i 并重寫了方法
*/
class Derived2(i : Impl) : AnotherInterface by i{
//此處調(diào)用 i 實(shí)現(xiàn)的message屬性
override fun printMessage() {
println("Derived2.printMessage $message")
}
}
/**
* 測(cè)試方法
*/
fun testFun(){
val i = Impl(10)
Derived(i).printSomething()
Derived2(i).printMessage()
println(Derived2(i).message)
}
fun main(args:Array<String>){
testFun()
}
Example2:
/**
* @Author CelebrateG
* @Description 委托屬性
* @Date 2018/10/26
*/
/**
* 通過(guò) by 關(guān)鍵字編譯器會(huì)自動(dòng)生成一個(gè)輔助屬性 val delegate = Delegate()
* p 的訪問都會(huì)調(diào)用對(duì)應(yīng) delegate 的 getValue 和 setValue 方法
*/
class Example {
var p: String by Delegate()
}
/**
* 屬性的委托不必實(shí)現(xiàn)任何的接口吠撮,
* 但是需要提供一個(gè) getValue() 函數(shù)
* (與 setValue()函數(shù)——對(duì)于 var 屬性)
* 即將訪問器的邏輯委托給一個(gè)輔助對(duì)象
* 兩函數(shù)都需要用 operator 關(guān)鍵字來(lái)進(jìn)行標(biāo)記
*/
class Delegate{
/**
* thisRef 必須與屬性所有者類型(對(duì)于擴(kuò)展屬性——指被擴(kuò)展的類型)相同
* 或者是它的超類型(可以理解為接受屬性的實(shí)例)
* property 必須是類型 KProperty<*> 或其超類型(可以理解為屬性本身)
* 函數(shù)必須返回與屬性相同的類型(或其子類型)
*/
operator fun getValue(thisRef : Any?,property : KProperty<*>):String{
return "thisRef:$thisRef ,property:'${property.name}'"
}
/**
* thisRef,property同上
* value 必須與屬性同類型或者是它的超類型
*/
operator fun setValue(thisRef : Any?,property : KProperty<*>,value : String){
println("value:${value.toString()},property:'${property.name}',thisRef:${thisRef.toString()}")
}
}
/**
* 自 Kotlin 1.1 起也可以在函數(shù)
* 或代碼塊中聲明一個(gè)委托屬性
*/
fun aFun(){
var name : String by Delegate()
name = "aFun"
println(name)
}
包結(jié)構(gòu):
??基本按照 Kotlin 語(yǔ)言中文站目錄劃分,建議可以先從 grammer 目錄基本語(yǔ)法開始看起讲竿。
image
項(xiàng)目中的依賴:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
androidTestImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
implementation 'org.jetbrains.exposed:exposed:0.11.2'