跳转到正文
ygjoon
返回

Android Kotlin 数据类型与空安全

编辑文章

数据类型总览

分类类型示例说明
数值类型Byte、Short、Int、LongKotlin 没有隐式拓宽,需要显式转换
小数类型Float、Double默认 Double,使用 f 或 F 声明 Float
布尔Boolean与 Java 一致
字符Char使用单引号 'a'
字符串String支持模板与多行字符串
数组IntArray、Array<String>原生类型数组与对象数组区分
val numbers: IntArray = intArrayOf(1, 2, 3)
val names: Array<String> = arrayOf("Alice", "Bob")

空安全核心语法

1. 可空类型与安全调用

val content: String? = fetchFromCache()
val length = content?.length ?: 0

2. 非空断言

val text: String? = intent.getStringExtra("title")
val upper = text!!.uppercase() // 若 text 为空将抛出异常

仅在逻辑上可以确保不为空时使用 !!,否则建议改用 requireNotNull。

3. let / run / also / apply

val userName = sharedPreferences.getString("user_name", null)?.let { name ->
    name.trim().ifEmpty { "Guest" }
}

类型转换与智能类型推断

fun printLength(value: Any) {
    if (value is String) {
        println(value.length) // 智能转换,无需显式 cast
    }
}

val number = "123".toIntOrNull() ?: 0

数据类与解构

data class User(val id: Long, val name: String?, val age: Int)

val (id, name, age) = User(1, null, 18)

Android 场景实战

1. Intent 参数读取

val count = intent.extras?.getInt("count") ?: 0
val userId = intent.getStringExtra("user_id")?.toLongOrNull()

2. Room Entity 默认值

@Entity
data class Article(
    @PrimaryKey val id: Long,
    val title: String = "",
    val content: String? = null,
    val publishTime: Instant? = null
)

3. Retrofit 数据模型

data class ApiResponse<T>(
    val code: Int,
    val data: T?,
    val message: String?
)

fun <T> ApiResponse<T>.requireData(): T {
    return data ?: throw IllegalStateException("data is null, code=$code")
}

常见空指针来源

来源说明应对策略
Java 互操作Java 返回可空值但未标记 @Nullable手动标注 @file:JvmName 共用扩展函数
第三方 SDK未引入 Kotlin 空安全注解使用 ?./?: 防御性处理
全局变量延迟初始化lateinit var 未赋值在访问前调用 ::var.isInitialized

总结

  1. Kotlin 通过类型系统从语言层面杜绝大部分空指针问题,但仍需谨慎使用 !!。
  2. 利用智能类型转换与 let/run 等函数,可以显著提升代码可读性。
  3. 在 Android 项目中与 Java 混编时,必须关注可空性注解,必要时封装安全访问层。

下一篇将深入函数与 Lambda,了解 Kotlin 在函数式编程方面的特性。


编辑文章
分享这篇文章:

上一篇
Android Kotlin 日志监控与可观测性
下一篇
Android Kotlin 性能分析与内存调优