一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情。
本文主要是讲解Kotlin中常见的注解,灵活的使用它们能帮助我们提高开发效率,减少模板代码,更加友好的实现java与kotlin的互操。
给属性的get
、set
方法加锁
一般我们给类的某个属性的set
或get
方法加锁的方式如下:
class DelegateImpl2 {
private var name: String = ""
@Synchronized
fun setName(name: String) {
}
@Synchronized
fun getName(): String {
}
}
这种方式效率太低,直接利用注解@set/get: Synchronized
即可:
@set: Synchronized
@get: Synchronized
var name: String = ""
val
的属性需要加锁时只需要使用@get: Synchronized
重命名kotlin文件名便于java调用
我们定义一个顶层函数:
看下在java中如何调用:
也就是说,我们每次创建一个kotlin文件xxx.kt,kotlin编辑器默认都会帮助我们生成一个xxxKt的类
,而定义的顶层函数就是这个类的静态方法
,所以在java中才会这样调用。
kotlin中可以直接test()
调用本质上也是编译器帮助我们实现了DelegateImpl2Kt.test()
调用,大家可以自行反编译看下。
我们可以通过注解@file: JvmName("DelegateImplTest")
重命名kotlin文件xxx.kt
所默认生成的xxxKt
类名:
然后在java中这样使用:
整体去除kotlin文件中黄色警告
上面Test()
方法会由于方法名大写、未使用警告,test
属性也会报未使用警告,我们可以在类或者方法上使用@Suppress
注解:
但是如果一个kotlin文件中的类非常多,每个类都会有方法名大写、未使用或其他警告,难道我们要一个个类上增加@Suppress
注解吗?太麻烦了!!
可以直接在kotlin文件开头增加@file: Suppress("")
即可:
限制kotlin方法禁止java访问
有时我们定义的Kotlin扩展方法专门是为kotlin提供的,不想让java调用以至于太复杂,比如下面方法:
fun ext(block: Demo1.(String) -> Unit) {
val demo = Demo1()
demo.block("")
}
kotlin直接可以这样调用:ext {}
,在java中使用起来就很复杂了:
DelegateImpl2Kt.ext(new Function2<Demo1, String, Unit>() {
@Override
public Unit invoke(Demo1 demo1, String s) {
return null;
}
});
想要限制java调用kotlin方法直接使用@JvmSynthetic
注解修饰调用的kotlin方法ext
即可,这样在java中调用ext
顶层方法就会报错: