你需要懂的Kotlin开发技巧之九-灵析社区

德州安卓

给属性的getset方法加锁

一般我们给类的某个属性的setget方法加锁的方式如下:

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顶层方法就会报错:

阅读量:1279

点赞量:0

收藏量:0