一手遮天 Android - kotlin: 类相关 3(枚举,密封类,数据类)

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

一手遮天 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>

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

posted @ 2021-05-31 12:13  webabcd  阅读(86)  评论(0编辑  收藏  举报