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)
}
复制代码
注意!若将
private
,则无法被扩展属性访问,如下:
注意!说到没有backing field,
interface
中的property也没有backing field。因为interface
原则上仅定义行为,不存储状态。如下: