【Kotlin】初识Kotlin之扩展函数与属性
1、扩展函数
在Kotlin中,对于已经定义好的class,我们可以使用扩展函数的方式,给这个类动态扩展一个函数方法,使用方法也很简单,看下面例子就懂了:
fun main() {
fun String.getLastChar() = this[this.length-1]
println("woodwhale".getLastChar())
}
上面的例子中,我们在main函数中写了一个tring.getLastChar()
函数,这是对String
类拓展了一个getLastChar()
函数,作用就是获取最后一位的Char
在上述拓展函数中,this
指的是当前这个对象,也就是自己这个字符串。在写拓展函数的时候我们可以具体分析情况来使用this
上述代码也可以这么写:
fun main() {
println("woodwhale".getLastChar())
}
fun String.getLastChar(): Char {
val index = this.length - 1
return this[index]
}
从中我们可以看到,扩展函数可以在任何地方定义
如果是内部类、嵌套类中的方法,或者伴生类中的方法,也可以使用同样的方式来拓展
fun main() {
fun Test.Companion.sout() = println("伴生类拓展函数")
Test.sout()
fun Test.InnerTest.sout() = println("内部类拓展函数")
Test().InnerTest().sout()
fun Test.TestB.sout() = println("嵌套类拓展函数")
Test.TestB().sout()
}
class Test {
class TestB {
}
inner class InnerTest {
}
companion object {
}
}
/*
伴生类拓展函数
内部类拓展函数
嵌套类拓展函数
进程已结束,退出代码0
*/
需要注意的是,如果扩展的函数名已经存在了原来的类中,那么或默认调用类中的成员方法
fun main(args: Array<String>) {
val extension = ExtensionTest()
// 此处调用的会是成员方法
extension.test()
}
class ExtensionTest {
fun test() = print("成员方法")
}
// 该方法不会被调用
fun ExtensionTest.test() = println("扩展方法")
2、扩展属性
在了解了扩展函数之后,我们也就不难理解扩展属性了
同样的方式来定义一个扩展的属性
但是在使用之前,我们需要知道扩展属性的几个限制:
- 扩展属性不能有初始值
- 扩展属性不能用filed关键字访问幕后字段
- val必须提供get方法,var必须提供get和set方法。
class Test {
val name = "woodwhale"
class TestB {
}
inner class InnerTest {
}
companion object {
}
}
val Test.property: String get() = this.name.uppercase()
val Test.TestB.property : String get() = Test().name.uppercase()
val Test.InnerTest.property: String get() = Test().name.uppercase()
val Test.Companion.property: String get() = Test().name.uppercase()
fun main() {
println(Test().property)
println(Test.property)
println(Test.TestB().property)
println(Test().InnerTest().property)
}
3、Kotlin中常用的扩展
在Kotlin源码中定义了大量的扩展,例如:let
、run
、apply
、with
,了解这些扩展函数的作用可以大大提高我们的代码效率!