kotlin基础【2】

变量类型

varval 的核心区别:

|-------|----------------|--------|-----------------|
| 关键字 | 含义 | 能否重新赋值 | 类似概念(Java) |
| var | variable(可变变量) | 可以 | 普通变量(无 final) |
| val | value(不可变变量) | 不可以 | 被 final 修饰的变量 |

var声明的变量可以被修改

Kotlin 复制代码
var age = 20
age = 21  // 合法,允许重新赋值

val 声明的变量不能修改:

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

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

Set

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

Kotlin 复制代码
private val ACTION_IDS_DEFAULT: Set<Int> = 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的枚举类型:

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函数来获取这个对象

java 复制代码
// 使用 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关键字

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

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

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

日志打印

Kotlin 复制代码
 Logger.warning(TAG, "Data is null!")

同java相似不赘述

主线操作

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

Kotlin 复制代码
// 将 eventId 替换为 currentEvent,类型仍为 EventIdEnum
when (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语句

Kotlin 复制代码
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语句可以这么写

Kotlin 复制代码
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
    }
}

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

Kotlin 复制代码
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表达式放在下一章

相关推荐
xnglan1 小时前
使用爬虫获取游戏的iframe地址
开发语言·爬虫·python·学习
zhysunny1 小时前
04.建造者模式的终极手册:从快餐定制到航天飞船的组装哲学
java·开发语言·建造者模式
郝学胜-神的一滴1 小时前
建造者模式:构建复杂对象的优雅方式
开发语言·c++·程序人生·建造者模式
AAIshangyanxiu1 小时前
最新基于R语言结构方程模型分析与实践技术应用
开发语言·r语言·结构方程模型·生态统计学
Fly-ping3 小时前
【前端】JavaScript 的事件循环 (Event Loop)
开发语言·前端·javascript
范纹杉想快点毕业3 小时前
基于C语言的Zynq SOC FPGA嵌入式裸机设计和开发教程
c语言·开发语言·数据库·嵌入式硬件·qt·fpga开发·嵌入式实时数据库
rockmelodies3 小时前
【PHP安全】免费解密支持:zend52、zend53、zend54好工具
开发语言·安全·php
Reggie_L3 小时前
Stream流-Java
java·开发语言·windows
巴伦是只猫4 小时前
Java 高频算法
java·开发语言·算法
程序员编程指南4 小时前
Qt容器类:QList、QMap等的高效使用
c语言·开发语言·c++·qt