栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

kotlin几个注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

kotlin几个注解

注解 @JvmField

我们都知道kotlin默认会给var的变量生成get和set方法,当我们给变量复制或者获取变量值的时候实际上相当于调用了get和set方法。

那么如果我们单纯的就是想设置变量值或者获取值,似乎就不需要默认生成get、set方法了。

如下例子:

class Person {
    var name: String="李白"//变量的get和set方法无论是否复写,都会被创建,但是实际上完全可以不需要,
        get() = field
        set(value) {
            field = value
        }
    
}

fun main() {
    Person().run {
        println(name)
        name="杜甫"
        println(name)
    }
}

我们对上面代码使用@JvmField进行一下修改,如下:

class Person {
    @JvmField var name: String="李白"//使用@JvmField修饰后的变量,不会被默认生成get和set方法了,变量访问自然比调用方法效率要高,如果能默认不生成就好了。
}

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();//只能借助INATANCE对象调用eat方法
    }

借助INSTANCE虽然调用起来没问题,但终归看着还是不爽的,使用@JvmStatic可以治好这种不爽。

使用@JvmStatic修饰后,代码如下:

kotlin中代码:

object Person{
    @JvmStatic
    fun eat(){
    }
}

在java中调用如下:

由上图可以发现,使用@JvmStatic修饰后,eat方法就可以像java中的静态方法一样的方式调用了。

@JvmSynthetic

使用@JvmSynthetic修饰的方法和字段,只能在kotlin中调用。

这是个好东西,可以帮助团队快速强制过渡到kotlin

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584360.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号