你需要懂的Kotlin开发技巧之四

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

1.@JvmName修改方法名

直接看例子:

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

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

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

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

@get: JvmName("getSource")
@set: JvmName("setSource")
var mData: String = ""
复制代码

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

image.png

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

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

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

image.png

image.png

可以看到,使用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代码看下:

image.png

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

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

val res = "aa".equals("AA", ignoreCase = true)
复制代码

反编译:

image.png

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

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"等等,都是日常开发中比较常用的,大家可以根据具体场景灵活运用

猜你喜欢

转载自juejin.im/post/7084008873987670047
今日推荐