不断学习,做更好的自己!💪

数据类

数据类通常需要重写 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,其排序就是按照字段在枚举类中定义的顺序来的。