zoukankan      html  css  js  c++  java
  • 一手遮天 Android

    项目地址 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);
            appendMessage("$a") // Demo9_DataClass{name=webabcd,age=40}
    
            a.name = "wanglei"
            appendMessage("$a") // Demo9_DataClass{name=wanglei,age=40}
    
            // 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("
    ")
        }
    }
    

    kotlinDemo9_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"
    }
    

    kotlinDemo9_SealedClass.kt

    /**
     * 密封类的示例
     */
    
    package com.webabcd.androiddemo.kotlin
    
    // 密封类不能实例化
    sealed class Demo9_SealedClass {
        class OK : Demo9_SealedClass()
        class ERROR : Demo9_SealedClass()
    }
    

    kotlinDemo9_DataClass.kt

    /**
     * 数据类的示例
     */
    
    package com.webabcd.androiddemo.kotlin
    
    // 构造函数中的参数,可以直接用 var 或 val 声明,其会自动生成 public 的同名属性
    // class 用 data 修饰,则会自动支持解构,以及支持 copy 方法
    data class Demo9_DataClass(var name: String, val age: Int)
    

    /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

  • 相关阅读:
    Power BI for Office 365(八)共享查询
    Power BI for Office 365(七) Power BI站点
    Power BI for Office 365(六)Power Map简介
    Power BI for Office 365(五)Power View第二部分
    Power BI for Office 365(四)Power View第一部分
    Power BI for Office 365(三)Power Pivot
    Power BI for Office 365(二)Power Query
    java 继承、重载、重写与多态
    Android 热修复方案Tinker(一) Application改造
    阿里最新热修复Sophix与QQ超级补丁和Tinker的实现与总结
  • 原文地址:https://www.cnblogs.com/webabcd/p/android_kotlin_Demo9.html
Copyright © 2011-2022 走看看