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