美文网首页
Kevin Learn Kotlin:数据类、单例类、枚举类

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

作者: Kevin_小飞象 | 来源:发表于2022-02-09 11:14 被阅读0次

    数据类

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

    • equals:用来比较实例
    • hashCode:用来作为例如 HashMap 这种基于哈希容器的类
    • 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 方法会将所有在主构造方法中声明的属性纳入考虑:

    • equals 方法会检测所有的属性的值是否相等
    • hashCode 方法会返回一个根据所有属性生成的哈希值

    单例类

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

    • 对象声明 是定义单例的一种方式
    • 伴生对象 可以持有工厂方法和其它与这个类相关,但在调用时并不依赖类实例的方法,它们的成员可以通过类名来访问。
    • 对象表达式 用来替代 Java 的匿名内部类。

    在 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,其排序就是按照字段在枚举类中定义的顺序来的。

    相关文章

      网友评论

          本文标题:Kevin Learn Kotlin:数据类、单例类、枚举类

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