Kotlin 注解2

2018-07-20  本文已影响0人  Wavky

@JvmStatic

被标记的函数、变量将编译为Java中的类静态成员变量,不需要通过伴随对象Companion引用:

class C {
    companion object {
        @JvmStatic fun foo() {}
        fun bar() {}
    }
}
// In Java:
C.foo(); // works fine
C.bar(); // error: not a static method
C.Companion.foo(); // instance method remains
C.Companion.bar(); // the only way it works


object Obj {
    @JvmStatic fun foo() {}
    fun bar() {}
}
// In Java:
Obj.foo(); // works fine
Obj.bar(); // error
Obj.INSTANCE.bar(); // works, a call through the singleton instance
Obj.INSTANCE.foo(); // works too

@Synchronized

和Java中给类加上Synchronized修饰符一样,实现线程安全。

@Volatile

和Java的Volatile修饰符作用一样。

@JvmOverloads

Kotlin中@JvmOverloads 注解

在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。

由于默认参数值在Java调用中不起作用:

fun f(a: String, b: Int = 0, c: String="abc"){
    ...
}

相当于在Java中声明

void f(String a, int b, String c){
}

在使用@JvmOverloads注解后:

@JvmOverloads fun f(a: String, b: Int=0, c:String="abc") { ... }

相当于在Java中声明了3个方法:

void f(String a)
void f(String a, int b)
void f(String a, int b, String c)

注:该注解也可用在构造方法和静态方法。

class MyLayout: RelativeLayout {

   @JvmOverloads
   constructor(context:Context, attributeSet: AttributeSet? = null, defStyleAttr: Int = 0)
    : super(context, attributeSet, defStyleAttr)
}

※ 尤其在重写View的时候,需要声明为

class xxx @JvmOverloads constructor()
上一篇 下一篇

猜你喜欢

热点阅读