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
我们定义一个顶层函数:
看下在java中如何调用:
也就是说,我们每次创建一个kotlin文件xxx.kt,kotlin编辑器默认都会帮助我们生成一个xxxKt的类
,而定义的顶层函数就是这个类的静态方法
,所以在java中才会这样调用。
kotlin中可以直接test()
调用本质上也是编译器帮助我们实现了DelegateImpl2Kt.test()
调用,大家可以自行反编译看下。
我们可以通过注解@file: JvmName("DelegateImplTest")
重命名kotlin文件xxx.kt
所默认生成的xxxKt
类名:
然后在java中这样使用:
上面Test()方法会由于方法名大写、未使用警告,test属性也会报未使用警告,我们可以在类或者方法上使用@Suppress注解:
但是如果一个kotlin文件中的类非常多,每个类都会有方法名大写、未使用或其他警告,难道我们要一个个类上增加@Suppress
注解吗?太麻烦了!!
可以直接在kotlin文件开头增加@file: Suppress("")
即可:
有时我们定义的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顶层方法就会报错:
阅读量:1279
点赞量:0
收藏量:0