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

2020-05-09  本文已影响0人  Yapple

数据类

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与众不同的编译解释手法。

上一篇下一篇

猜你喜欢

热点阅读