一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
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.运算符重载get
、set
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"等等,都是日常开发中比较常用的,大家可以根据具体场景灵活运用