1 使用举例
1.1 扩展方法使用场景举例
一、为String类添加一个判断是否是邮箱地址的扩展方法isEmail():
fun String.isEmail(): Boolean {
//TODO: 判断是否符合邮箱格式
return true
}
fun main() {
"example@example.com".isEmail()
}
复制代码
二、为String类添加一个给字符串前后添加padding的扩展方法padding():
fun String.padding(count:Int = 0, char:Char = ' '): String {
val padding = (1..count).joinToString(""){char.toString()}
return "${padding}${this}${padding}"
}
fun main() {
println("Hello Kotlin".padding(10, '#'))
}
复制代码
三、为String类添加一个字符串翻倍的扩展方法times():
fun String.times(count:Int = 1): String {
return (1..count).joinToString(""){this}
}
fun main() {
println("Hello Kotlin".times(10))
}
复制代码
1.2 扩展属性
一、为Person类新增一个occupation属性,该occupation属性使用job属性存储状态:
//这里的Person类和Policeman类就是《Java转Kotlin:类和接口》中的Person类和Policeman类
var Person.occupation: String
get() = "$name's occupation is $job."
set(value) {
job = value
}
fun main() {
val jack = Policeman("mike", 18, "Policeman", 56);
println(jack.job)
println(jack.occupation)
jack.occupation = "Fireman"
println(jack.job)
println(jack.occupation)
jack.job = "Policeman"
println(jack.job)
println(jack.occupation)
}
复制代码
注意!扩展属性无幕后字段(Extention property does not have a backing field.)。如果一定要存储扩展属性的状态的话,需要利用类里面已有的非扩展属性。
二、为Person类新增一个扩展属性money:
class Person {
var pocket: Double = 0.0
}
var Person.money: Double
get() = this.pocket
set(value) {
this.pocket = value
}
fun main() {
val jack = Person();
println(jack.pocket)
println(jack.money)
jack.money = 20.0
println(jack.pocket)
println(jack.money)
jack.pocket = 36.0
println(jack.pocket)
println(jack.money)
}
复制代码
注意!若将pocket设置为private,则无法被扩展属性访问,如下:
注意!说到没有backing field,interface中的property也没有backing field。因为interface原则上仅定义行为,不存储状态。如下:
2 扩展方法的类型
3 本节回顾