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

  • 相关阅读:
    noip2011 总结
    noip2010 总结
    noip2009 总结
    noip2008 总结
    noip2006总结
    noip2007 总结
    noip2006 总结
    【模板】线段树模板
    【数学】8.30题解-count数页码
    【数论】8.30题解-prime素数密度 洛谷p1835
  • 原文地址:https://www.cnblogs.com/webabcd/p/android_kotlin_Demo9.html
Copyright © 2011-2022 走看看