Java转Kotlin:扩展方法与扩展属性

·  阅读 656

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 本节回顾

分类:
代码人生
标签:
分类:
代码人生
标签:
收藏成功!
已添加到「」, 点击更改