Kotlin最全语法学习——KotlinWithNotes项目
2018-11-26 本文已影响0人
CelebrateG
本项目总结了 Kotlin 几乎全部的知识点,代码中有详尽的注释,用以帮助理解。本人主要参考了 Kotlin 语言中文站、Kotlin 教程 | 菜鸟教程 中的代码示例。部分知识难点如:委托模式、注解、反射,通过查阅《Kotlin实战》进行了相关总结,欢迎大家一起研究学习。
项目地址:https://github.com/CelebrateG/KotlinWithNotes
kotlin委托的栗子
委托是Kotlin中最独特和最强大的功能之一,下面是项目中的两个例子,
Example1:
/**
* @Author CelebrateG
* @Description 委托模式:操作的对象不用自己执行,而是把工作委托给另一个辅助对象
* 类委托,kotlin 通过 by 关键字将接口实现委托给另一个对象
*/
interface AnotherInterface{
val message: String
fun printSomething()
fun printMessage()
}
/**
* 接口实现类
* 即受委托的类
*/
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 关键字将接口的实现委托给了 i
* 委托对象 i 为 Derived 的构造参数
*/
class Derived(i : Impl) : AnotherInterface by i
/**
* 委托给 i 并重写了方法
*/
class Derived2(i : Impl) : AnotherInterface by i{
//此处调用 i 实现的message属性
override fun printMessage() {
println("Derived2.printMessage $message")
}
}
/**
* 测试方法
*/
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
*/
/**
* 通过 by 关键字编译器会自动生成一个辅助属性 val delegate = Delegate()
* p 的访问都会调用对应 delegate 的 getValue 和 setValue 方法
*/
class Example {
var p: String by Delegate()
}
/**
* 属性的委托不必实现任何的接口,
* 但是需要提供一个 getValue() 函数
* (与 setValue()函数——对于 var 属性)
* 即将访问器的逻辑委托给一个辅助对象
* 两函数都需要用 operator 关键字来进行标记
*/
class Delegate{
/**
* thisRef 必须与属性所有者类型(对于扩展属性——指被扩展的类型)相同
* 或者是它的超类型(可以理解为接受属性的实例)
* property 必须是类型 KProperty<*> 或其超类型(可以理解为属性本身)
* 函数必须返回与属性相同的类型(或其子类型)
*/
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 起也可以在函数
* 或代码块中声明一个委托属性
*/
fun aFun(){
var name : String by Delegate()
name = "aFun"
println(name)
}
包结构:
基本按照 Kotlin 语言中文站目录划分,建议可以先从 grammer 目录基本语法开始看起。
项目中的依赖:
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'