美文网首页
kotlin:data,sealed,单例,伴生对象等特殊类形式

kotlin:data,sealed,单例,伴生对象等特殊类形式

作者: Yapple | 来源:发表于2020-05-09 18:16 被阅读0次

    数据类

    data关键字
    格式

    data class Student(val name: String, val id: Int, val age: Int)
    

    优势:自动重写了,equals(),hashCode(),toString()方法。(其中equals只去比较构造器中的val类型参数是否相同,var类型的参数将不影响equals()方法的结果)

    密封类

    sealed关键字
    格式

    sealed class Result
    class Success: Result()
    class Failure: Result()
    

    优势:密封性,在进行when条件选择时不需要添加else情况

    单例类

    object关键字
    格式

    object Singleton {
        fun xx() {
            println("ni xx")
        }
    }
    

    优势:简洁,调用时也只需像java中的静态方法一样使用:Singleton.xx()

    伴生对象

    companion object关键字
    格式

    class Util {
        fun xx() {
            println("ni xx")
        }
        companion object {
            //方法可与外部的同名
            fun xx() {
                println("wo xx")
            }
        }
    }
    

    优势:如同前面的单例类一样,调用方便Util.xx(),而单例对象毕竟是将所有的方法都变成类似于java中静态方法的调用方式,而伴生对象则可将部分方法变成静态方法调用方式

    静态方法

    @JvmStatic关键字
    格式

    class Util {
        companion object {
            @JvmStatic
            fun xx() {
                println("wo xx")
            }
        }
    }
    

    优势:上面讲的单例也好伴生对象也好,都不是真正的等同于java静态方法,我们可以通过加@JvmStatic注解的方法来实现(除了伴生对象的方法可以加,单例类的方法也可加)

    顶层函数

    或者叫顶层方法,其实和“@JvmStatic关键字”一样也是实现java静态方法的一种手段。

    const关键字

    将到静态方法不得不提一下const关键字,它实现了java中静态常量的作用。
    实际上应该称其为const val关键字,因为const只能修饰val。
    还有就是const只允许在top-level级别和object中声明
    格式

    const val NI_XX = "ni xx"
    object Singleton {
        const val NI_XX = "ni xx"
    }
    

    const val 和 val 的区别:https://www.jianshu.com/p/01aac645d003这篇文章介绍的详细又简洁,不过仍有些疑问如果说单独val的字节码为private的,那我在val前面添加public修饰符,则又会提示该修饰符多余。难道说kotlin的字节码中字段的可见域又和我们编写代码时不同吗?(当然如同文章中表示的那样会自动生成get方法,使得实际效果和我们想要的一样)我不清楚java类语言是否都有如此共性,还是kotlin与众不同的编译解释手法。

    相关文章

      网友评论

          本文标题:kotlin:data,sealed,单例,伴生对象等特殊类形式

          本文链接:https://www.haomeiwen.com/subject/bfiknhtx.html