注解
@JvmField
我们都知道kotlin默认会给var的变量生成get和set方法,当我们给变量复制或者获取变量值的时候实际上相当于调用了get和set方法。
那么如果我们单纯的就是想设置变量值或者获取值,似乎就不需要默认生成get、set方法了。
如下例子:
class Person {
var name: String="李白"
get() = field
set(value) {
field = value
}
}
fun main() {
Person().run {
println(name)
name="杜甫"
println(name)
}
}
我们对上面代码使用@JvmField进行一下修改,如下:
class Person {
@JvmField var name: String="李白"
}
fun main() {
Person().run {
println(name)
name="杜甫"
println(name)
}
}
@JvmOverloads
一句话概括,@JvmOverloads修饰的kotlin方法,编译期间可以给方法的默认参数生成重载,从而保证java调用kotlin方法仍然可以保证简洁
我们都知道kotlin是支持默认参数的,如下的代码
class Anim(){
fun sport(method:String="翅膀",breath:String="鼻子"){
println("使用翅膀移动")
println("使用鼻子呼吸")
}
}
fun main() {
Anim().sport()//因为有默认参数值,所以这里可以什么都不传
}
因为sport有默认参数值,所以这里可以什么都不传
但是,如果我们使用java调用sport方法,那么就必须两个参数都传,否则会报如下错误:
为了解决这个尴尬的问题我么可以引入@JvmOverloads,这样编译器会默认为我们生成多个构造函数,保证java可以不用传太多参数,代码如下:
class Anim(){
@JvmOverloads
fun sport(method:String="翅膀",breath:String="鼻子"){
println("使用翅膀移动")
println("使用鼻子呼吸")
}
}
fun main() {
Anim().sport()
}
我么来看一下java调用方法时候的提示:
由上图可以发现,kotlin编译器生成了三个重载方法。
不过建议还是all in kotlin这样最爽。
@JvmStatic
这依然是一个为了简化java调用kotlin方法的注解,主要针对kotlin的object修饰类中的方法,或者object component中的方法
举例: 我们生成如下的一个类
object Person{
fun eat(){
}
}
这样一个类,方法相当于是静态的,一切看起来都很好,但是当我们再java中想调用eat方法的时候,写法是这样的。
public static void main(String[] args) {
Person.INSTANCE.eat();
}
借助INSTANCE虽然调用起来没问题,但终归看着还是不爽的,使用@JvmStatic可以治好这种不爽。
使用@JvmStatic修饰后,代码如下:
kotlin中代码:
object Person{
@JvmStatic
fun eat(){
}
}
在java中调用如下:
由上图可以发现,使用@JvmStatic修饰后,eat方法就可以像java中的静态方法一样的方式调用了。
@JvmSynthetic
使用@JvmSynthetic修饰的方法和字段,只能在kotlin中调用。
这是个好东西,可以帮助团队快速强制过渡到kotlin
|