一手遮天 Android - kotlin: 类相关 3(枚举,密封类,数据类)
一手遮天 Android - kotlin: 类相关 3(枚举,密封类,数据类)
示例如下:
/kotlin/Demo9.kt
/**
* 本例用于演示枚举,密封类,数据类
*/
package com.webabcd.androiddemo.kotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.webabcd.androiddemo.R
import kotlinx.android.synthetic.main.activity_kotlin_helloworld.*
class Demo9 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin_demo9)
sample1() // 枚举
sample2() // 密封类
sample3() // 数据类
}
fun sample1() {
// .name 是枚举常量的名称
// .ordinal 是枚举常量在枚举中的序号
appendMessage("${Demo9_Enum1.OK}, ${Demo9_Enum1.ERROR}, " + // OK, ERROR
"${Demo9_Enum1.OK.name}, ${Demo9_Enum1.ERROR.name}, " + // OK, ERROR
"${Demo9_Enum1.OK.ordinal}, ${Demo9_Enum1.ERROR.ordinal}") // 0, 1
// Demo9_Enum2.OK.status - 用于演示如何获取枚举常量的对应的构造函数中的参数值
// Demo9_Enum2.OK.getMessage() - 用于演示如何调用枚举中的方法
appendMessage("${Demo9_Enum2.OK}, ${Demo9_Enum2.OK.ordinal}, ${Demo9_Enum2.OK.status}, ${Demo9_Enum2.OK.getMessage()}") // OK, 0, 100, message:100
// 遍历枚举常量
appendMessage(enumValues<Demo9_Enum2>().joinToString { it.name }) // OK, ERROR
// 字符串转枚举常量
appendMessage("${enumValueOf<Demo9_Enum2>("ERROR").status}") // 200
// 字符串转枚举常量
appendMessage("${Demo9_Enum2.valueOf("ERROR").status}") // 200
// 获取枚举中指定序号的枚举常量
appendMessage("${Demo9_Enum2.values()[1].status}") // 200
}
fun sample2() {
// 密封类不能实例化
// 密封类的用处和枚举差不多,区别就是枚举常量是单例的,而密封类的子类可以有多个实例
var a = Demo9_SealedClass.OK()
var b = Demo9_SealedClass.OK()
// 通过类似 a is Demo9_SealedClass.OK 的方式实现枚举的作用
appendMessage("${a is Demo9_SealedClass.OK}, ${b is Demo9_SealedClass.OK}, ${a == b}") // true, true, false
}
fun sample3() {
var a = Demo9_DataClass("webabcd", 40)
a.salary = 5000
// 数据对象支持 toString(), componentN()
appendMessage("$a, ${a.component1()}, ${a.component2()}") // Demo9_DataClass(name=webabcd,age=40), webabcd, 40
// 数据对象支持 equals()
appendMessage("${a == Demo9_DataClass("webabcd", 40)}") // true
// 数据对象支持 copy(),其用于复制数据对象,且可以同时修改只读变量
var b = a.copy(age = 100)
appendMessage("$b") // Demo9_DataClass(name=wanglei,age=100)
// 数据对象支持解构
val (name, age) = b
appendMessage("name:$name, age:$age") // name:wanglei, age:100
// 系统自带的 Pair 就是一个数据类
var p = Pair(1, "abc")
appendMessage("first:${p.first}, second:${p.second}") // first:1, second:abc
// 系统自带的 Triple 就是一个数据类
var t = Triple(2, "xyz", true)
appendMessage("first:${t.first}, second:${t.second}, third:${t.third}") // first:2, second:xyz, third:true
}
fun appendMessage(message: String) {
textView1.append(message)
textView1.append("\n")
}
}
\kotlin\Demo9_Enum.kt
/**
* 枚举的示例
*/
package com.webabcd.androiddemo.kotlin
enum class Demo9_Enum1 {
// 枚举常量
OK,
ERROR
}
// 带构造函数的枚举
enum class Demo9_Enum2 (var status: Int) {
// 枚举常量(使用枚举构造函数)
OK(100),
ERROR(200); // 这里要有分号,用于分隔枚举常量和方法
// 枚举中的方法
fun getMessage() = "message:$status"
}
\kotlin\Demo9_SealedClass.kt
/**
* 密封类的示例
*/
package com.webabcd.androiddemo.kotlin
// 用 sealed 修饰的类就是密封类
// 密封类不能实例化
sealed class Demo9_SealedClass {
class OK : Demo9_SealedClass()
class ERROR : Demo9_SealedClass()
}
\kotlin\Demo9_DataClass.kt
/**
* 数据类的示例
*/
package com.webabcd.androiddemo.kotlin
// 用 data 修饰的类就是数据类
// 主构造函数中的参数,可以直接用 var 或 val 声明,其会自动生成 public 的同名属性
// 主构造函数中声明的属性会支持数据类的特性,比如解构, toString(), copy(), equals(), componentN() 等
data class Demo9_DataClass(var name: String, val age: Int) {
// 这里声明的属性不支持数据类的特性
var salary = 1000
}
/layout/activity_kotlin_demo9.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>