Kevin Learn Kotlin:数据类、单例类、枚举类

2022-02-09  本文已影响0人  Kevin_小飞象

数据类

数据类通常需要重写 equals()、hashCode()、toString() 这几个方法:

在 Kotlin 中,只需要类中添加 data 关键字,以上这些必要的方法就会自动生成好,如下:

data class Person(val name: String,val age: Int)

fun main() {
    val person = Person("Kevin",18)
    println(person)

    val person2 = Person("Kevin",18)
    println(person == person2)

    val hashSet = hashSetOf<Person>()
    hashSet.add(person)
    println(hashSet.contains(person2))
}

运行结果:

Person(name=Kevin, age=18)
true
true

equals 和 hashCode 方法会将所有在主构造方法中声明的属性纳入考虑:

单例类

object 关键字在多种情况下出现,它的核心理念为:这个关键字 定义一个类并同时创建一个实例,下面我们介绍它的三个应用场景:

在 Kotlin 中创建一个单例类的方式极其简单,只需将 class 关键字改为 object 关键字即可。

object Singleton {
    fun test() {
        println("test is called.")
    }
}

fun main() {
    Singleton.test()
}

枚举类

在 Kotlin 中,每个枚举常量都是一个对象。枚举常量用逗号分隔。 例如我们写一个枚举类 Programer。

enum class Programer {
    JAVA, KOTLIN, C, CPP, ANDROID;
}

当它被编译成 class 后,将转为如下代码实际就是一个私有了构造函数的 kotlin.Enum 继承类。

public final enum class Programer 
private constructor() : kotlin.Enum<Programer> {
    JAVA, KOTLIN, C, CPP, ANDROID;
}

kotlin.Enum 这个类

public abstract class Enum<E : Enum<E>>
(name: String, ordinal: Int): Comparable<E> {
    companion object {}

    /**
     * Returns the name of this enum constant,
     *  exactly as declared in its enum declaration.
     */
    public final val name: String

    /**
     * Returns the ordinal of this enumeration 
     * constant (its position in its enum 
     * declaration, where the initial constant
     * is assigned an ordinal of zero).
     */
    public final val ordinal: Int

    public override final fun compareTo(other: E): Int
}

其实在 Kotlin 中,枚举的本质是一个实现了Comparable 的 class,其排序就是按照字段在枚举类中定义的顺序来的。

上一篇下一篇

猜你喜欢

热点阅读