> 技术文档 > kotlin基础【2】

kotlin基础【2】


变量类型

varval 的核心区别:

关键字

含义

能否重新赋值

类似概念(Java)

var

variable(可变变量)

可以

普通变量(无 final

val

value(不可变变量)

不可以

final 修饰的变量

var声明的变量可以被修改

var age = 20age = 21 // 合法,允许重新赋值

val 声明的变量不能修改:

val name = \"Kotlin\"name = \"Java\" // 编译报错!不允许重新赋值
  • val 声明的变量虽然不能重新赋值,但如果它是对象(如集合、类实例),对象内部的属性是可以修改的:

    val list = mutableListOf(1, 2, 3)list.add(4) // 合法,修改的是对象内部数据,不是重新赋值变量// list = mutableListOf(5,6) // 编译报错,不允许重新赋值变量本身

    Set 

    定义了一个私有不可变接受Int类型的Set对象ACTION_IDS_DEFAULT,setOf(...)是Kotlin 的集合创建函数,用于初始化一个不可变集合,括号中是具体的事件 ID(通常来自枚举的 id 属性)。

    private val ACTION_IDS_DEFAULT: Set = setOf( ActionTypeEnum.ACTION_START_CONNECTION.actionId, ActionTypeEnum.ACTION_STOP_SERVICE.actionId, ActionTypeEnum.ACTION_REFRESH_DATA.actionId, ActionTypeEnum.ACTION_CLEAR_CACHE.actionId, ActionTypeEnum.ACTION_UPDATE_SETTINGS.actionId, ActionTypeEnum.ACTION_SAVE_CONFIG.actionId, ActionTypeEnum.ACTION_RESET_DEVICE.actionId, ActionTypeEnum.ACTION_SYNC_STATUS.actionId)

    如何定义一个java的枚举类型:

    public enum EventIdEnum { // 事件类型枚举值,包含事件ID和事件描述两个成员变量 EVENT_UPDATE_CONNECT_STATUS(1001, \"连接状态更新事件\"), EVENT_UPDATE_DEVICE_INFO(1002, \"设备信息更新事件\"), EVENT_UPDATE_SUPPORT_DESKTOP(1003, \"桌面支持状态更新事件\"), EVENT_UPDATE_HISTORY_DEVICE(1004, \"历史设备列表更新事件\"), EVENT_UPDATE_APP_LIST(1005, \"应用列表更新事件\"), EVENT_UPDATE_APP_INFO_CHANGED(1006, \"应用信息变更事件\"), EVENT_UPDATE_LINK_APP_SHOW_ALL_MENU(1007, \"链接应用菜单显示事件\"), EVENT_UPDATE_MEDIA_POSITION(1008, \"媒体播放位置更新事件\"), EVENT_UPDATE_MEDIA_STATUS(1009, \"媒体播放状态更新事件\"), EVENT_UPDATE_MEDIA_MODE(1010, \"媒体模式更新事件\"), EVENT_UPDATE_MEDIA_META_DATA(1011, \"媒体元数据更新事件\"); // 事件ID字段 private final int eventId; // 事件描述字段 private final String description; // 包含两个参数的构造函数 EventIdEnum(int eventId, String description) { this.eventId = eventId; this.description = description; } // 获取事件ID的方法 public int getEventId() { return eventId; } // 获取事件描述的方法 public String getDescription() { return description; }}

    构成一个java枚举类型的部分:
    成员变量,实现的类型,构造函数,get方法

    单例对象:

    kt可以使用object关键字直接定义一个单例对象,在别的函数中可以直接使用类名来获得这个对象,不需要定义getInstance函数来获取这个对象

    // 使用 object 关键字创建单例object AppConfig { // 单例中的成员变量 var apiBaseUrl: String = \"https://api.example.com\" var timeout: Int = 30000 // 30秒 // 单例中的方法 fun init(baseUrl: String, timeout: Int) { this.apiBaseUrl = baseUrl this.timeout = timeout } fun getFullUrl(endpoint: String): String { return \"$apiBaseUrl/$endpoint\" }}

    方法的重写

    使用override关键字

    override fun onReceivedPublishedData( packageName: String?, eventIdentifier: Int, dataBytes: ByteArray?) { // 重写的方法实现逻辑 // 可以调用父类实现(如果需要)}

    可以看出方法接受一个可以为空的String类型的packageName,Int 类型的eventIdentifier,可以为空的Byte类型数组(在上一节提过)

    ByteArray 是一个字节数组类型,用于存储原始的字节数据。它与 Java 中的 byte[] 是兼容的(可以直接互操作),常用于处理二进制数据,比如网络传输、文件读写、加密解密等场景。

    日志打印

     Logger.warning(TAG, \"Data is null!\")

    同java相似不赘述

    主线操作

    ThreadUtils.runOnMainThread { ... }:这是一个工具类方法,用于将代码块切换到主线程执行。

    // 将 eventId 替换为 currentEvent,类型仍为 EventIdEnumwhen (currentEvent) { EventIdEnum.EVENT_UPDATE_CONNECT_STATUS -> ThreadUtils.runOnMainThread { onConnectionStatusChanged(packageName, dataJson) } EventIdEnum.EVENT_UPDATE_DEVICE_INFO -> ThreadUtils.runOnMainThread { onDeviceInfoUpdated(packageName, dataJson) } EventIdEnum.EVENT_UPDATE_SUPPORT_DESKTOP -> ThreadUtils.runOnMainThread { onDesktopSupportChanged(packageName, dataJson) } EventIdEnum.EVENT_UPDATE_HISTORY_DEVICE -> ThreadUtils.runOnMainThread { onHistoryDeviceListUpdated(packageName, dataJson) } EventIdEnum.EVENT_UPDATE_APP_LIST -> ThreadUtils.runOnMainThread { onAppListUpdated(packageName, dataJson) }}

    什么操作需要放在主线程?

    涉及到更新UI页面的操作,这些调用的函数会引起UI界面的改变,所以需要放在主线程

    其他长时间且不直接涉及UI界面改变的可以放在子线程

    when语句

    when (it.dataCategory) { CategoryTypeConfig.TYPE_FIRST_SYSTEM -> { DataSourceConstants.SOURCE_PRIMARY_SYSTEM } CategoryTypeConfig.TYPE_SECONDARY_TOOL -> { DataSourceConstants.SOURCE_AUXILIARY_TOOL } CategoryTypeConfig.TYPE_THIRD_PARTY -> { DataSourceConstants.SOURCE_EXTERNAL_MODULE } else -> { DataSourceConstants.SOURCE_EXTERNAL_MODULE }}

    when语句这一段实际上返回的是一个变量,所以when语句可以这么写

    var data = when (it.dataCategory) { CategoryTypeConfig.TYPE_FIRST_SYSTEM -> { DataSourceConstants.SOURCE_PRIMARY_SYSTEM } CategoryTypeConfig.TYPE_SECONDARY_TOOL -> { DataSourceConstants.SOURCE_AUXILIARY_TOOL } CategoryTypeConfig.TYPE_THIRD_PARTY -> { DataSourceConstants.SOURCE_EXTERNAL_MODULE } else -> { DataSourceConstants.SOURCE_EXTERNAL_MODULE }}

    也可以把它作为一个参数传给一个函数

    callback.onProgress( when (it.itemType) { ItemTypeConfig.TYPE_STANDARD -> { ResourceType.SOURCE_STANDARD } ItemTypeConfig.TYPE_ENHANCED -> { ResourceType.SOURCE_ENHANCED } ItemTypeConfig.TYPE_PREMIUM -> { ResourceType.SOURCE_PREMIUM } else -> { ResourceType.SOURCE_PREMIUM } }, 100);

    lambda表达式放在下一章