@JvmName修改方法名直接看例子:
@JvmName("testCopy")
fun test(name: String, age: Int) {
}直接反编译成java代码看下:

最终生成的方法名称就是testCopy而不是test
@get:JvmName、@set:JvmName修改属性名@get: JvmName("getSource")
@set: JvmName("setSource")
var mData: String = ""直接反编译成java代码看下:

对于val属性则只能使用@get: JvmName
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!!非空
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)反编译:

可以看到,实现非常的简单,不会创建额外的局部变量
get、setgetclass Pro {
operator fun get(content: String): String {
return content.repeat(10)
}
}然后就可以这样使用:println(Pro()["blue"])
setoperator fun set(key: String, value: String) {
}set运算符重载至少需要传入两个参数,使用如下:Pro()["key"] = "value"
这两个运算符使用场景非常多,比如针对于Android中SharedPreference读写封装,具体详情可以参考文章:三.委托与SharedPreference的结合
还有很多其他的运算符重载函数,比如plus对应"+"、contains对应"in"等等,都是日常开发中比较常用的,大家可以根据具体场景灵活运用
阅读量:2032
点赞量:0
收藏量:0