你需要懂的Kotlin开发技巧之四-灵析社区

德州安卓

1.@JvmName修改方法名

直接看例子:

    @JvmName("testCopy")
    fun test(name: String, age: Int) {
    }

直接反编译成java代码看下:

最终生成的方法名称就是testCopy而不是test

2.@get:JvmName@set:JvmName修改属性名

@get: JvmName("getSource")
@set: JvmName("setSource")
var mData: String = ""

直接反编译成java代码看下:

对于val属性则只能使用@get: JvmName

3.String判空使用isNullOrEmpty,避免TextUtils.isEmpty()

我们分别对比下这两种写法:

可以看到,使用isNullOrEmpty判空的String,在调用name.length不会报错,使用TextUtils.isEmpty()的则会报错,需要强制声明name!!不为空`

为什么第一种不会报错呢,看下isNullOrEmpty的源码:

@kotlin.internal.InlineOnly
public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    contract {
        returns(false) implies (this@isNullOrEmpty != null)
    }

    return this == null || this.length == 0
}

最核心的就是isNullOrEmpty方法体中有个contract,这个会帮助编译器告知String是否为空,以至于当调用name.length时编译器能推断出String不是空的,就不需要程序强制声明name!!非空

4.忽略大小写比较equals

一般的大小写比较如下:

val res = "aa".toLowerCase(Locale.ROOT) ==  "AA".toLowerCase(Locale.ROOT)

反编译成java代码看下:

可以看到,"aa".toLowerCase(Locale.ROOT)赋值给一个局部变量var6"AA".toLowerCase(Locale.ROOT)赋值给另一个局部变量var7,然后再进行比较。

这种方式的比较会额外创建两个局部String变量,所以建议使用equals替换,其中第二个参数可以指定忽略大小写比较

val res = "aa".equals("AA", ignoreCase = true)

反编译:

可以看到,实现非常的简单,不会创建额外的局部变量

5.运算符重载getset

  • get
class Pro {
    operator fun get(content: String): String {
        return content.repeat(10)
    }
}

然后就可以这样使用:println(Pro()["blue"])

  • set
operator fun set(key: String, value: String) {
}

set运算符重载至少需要传入两个参数,使用如下:Pro()["key"] = "value"

这两个运算符使用场景非常多,比如针对于Android中SharedPreference读写封装,具体详情可以参考文章:三.委托与SharedPreference的结合

还有很多其他的运算符重载函数,比如plus对应"+"、contains对应"in"等等,都是日常开发中比较常用的,大家可以根据具体场景灵活运用

阅读量:1988

点赞量:0

收藏量:0