Kotlin 是 Android 开发的主要语言。根据 Google Android Docs (2025),超过 95% 的新 Android 项目使用 Kotlin。理解 Kotlin 特性 — data class、sealed class、协程和 scope functions — 是 Android 开发者的强制要求。
要点
Kotlin 扩展了 Java 的类概念。data class、sealed class、object 和 companion object — 这些是在 Java 中不存在或以不同方式实现的结构。
data class — 自动生成 equals()、hashCode()、toString()、copy() 和 componentN() 的类。非常适合数据模型(DTO、Entity)。要求:主构造函数中至少有一个参数、val/var、不能是 open/sealed/inner。sealed class — 具有受限子类层次结构的类。所有子类在编译时已知并在同一文件中声明。带 sealed class 的 when 表达式不需要 else 分支。sealed interface(Kotlin 1.9+)— 与 sealed class 相同但允许多重继承。object — 单例,用 object 关键字(不是 class)声明。线程安全的延迟初始化。companion object — 类的静态成员。有名称(默认为 Companion)。可以实现接口并拥有扩展函数。
| 类型 | 描述 | 用途 |
|---|---|---|
| data class | 自动生成 equals、hashCode、toString、copy | 数据模型、DTO、Entity |
| sealed class | 受限层次结构、when 检查 | 状态、结果、UI State |
| sealed interface | sealed class + 多重继承 | 事件、操作(Kotlin 1.9+) |
| object | 单例(声明式) | Factory、Utility、常量 |
| companion object | 类的静态成员 | Factory Method、静态常量 |
| enum class | 带常量的枚举 | 具有固定集合的状态 |
data class — 用于 90% 的模型。sealed class — 用于 UI State 和结果。object — 用于单例。IT Sectr 建议对所有屏幕状态(Loading、Success、Error)使用 sealed class。
Sealed class — 用于建模状态的强大工具。示例:UiState<T> 及其子类 Loading、Success(data: T)、Error(message: String)。when 表达式保证处理所有状态。Sealed interface — 用于需要多重实现的事件和操作。Value class(Kotlin 1.5+)— 无开销的单一值包装器。用于类型安全标识符:@JvmInline value class UserId(val id: String)。
Extension Function — 无需继承即可向现有类添加方法。fun String.isEmail(): Boolean。Extension Property — 属性同样(无 backing field)。Inline Function — 将函数体插入调用点 — 无调用开销。用于带 lambda 的 higher-order 函数。Higher-Order Function — 接受或返回另一个函数的函数。Scope Functions — 用于处理对象上下文的五个函数:let、run、with、apply、also。
let — 上下文 it,返回 lambda 结果。用于空安全调用(?.let {})。apply — 上下文 this,返回上下文。用于对象配置。run — 上下文 this,返回 lambda 结果。用于带上下文的计算。also — 上下文 it,返回上下文。用于副作用(日志记录)。with — 不是扩展,上下文 this,返回 lambda 结果。用于对对象的一组操作。Lambda — 匿名函数。Destructuring Declaration — 将 data class 解包为变量:val (name, age) = person。
Inline function 与 reified — 在 JVM 中保留泛型类型的唯一方法。用途:类型安全构建器(Gson.fromJson<T>())、类型检查(is T)、获取类(T::class)。Crossinline 和 Noinline — inline 函数中 lambda 参数的修饰符。crossinline — 禁止非局部返回,noinline — 禁止特定 lambda 的内联。IT Sectr 建议仅在处理类型时使用 inline + reified;对于普通的 higher-order 函数,inline 可能会增加字节码大小。
协程 — 用于异步编程的轻量级线程。不阻塞线程 — 挂起(suspend)。suspend function — 可以在不阻塞线程的情况下挂起的函数。只能从协程或其他挂起函数调用。
CoroutineScope — 协程的作用域。包含 CoroutineContext(Job + Dispatcher)。lifecycleScope — 用于 Activity/Fragment(生命周期感知)。viewModelScope — 用于 ViewModel(onCleared() 时自动取消)。GlobalScope — 全局作用域(不用于生产 — 内存泄漏)。Dispatchers:Dispatchers.Main(UI)、Dispatchers.IO(网络/磁盘)、Dispatchers.Default(CPU 密集型)、Dispatchers.Unconfined(不推荐)。launch — 启动协程:Job。async — 带结果启动:Deferred<T>。runBlocking — 阻塞桥接。withContext — 在挂起函数内切换 Dispatcher。
// 协程示例:在 ViewModel 中加载数据
class MainViewModel : ViewModel() {
private val _state = MutableStateFlow<UiState>(UiState.Loading)
val state: StateFlow<UiState> = _state.asStateFlow()
fun loadData() {
viewModelScope.launch {
_state.value = UiState.Loading
try {
val data = withContext(Dispatchers.IO) {
repository.fetchData()
}
_state.value = UiState.Success(data)
} catch (e: Exception) {
_state.value = UiState.Error(e.message)
}
}
}
}
// 使用 async 的并行请求
suspend fun loadCombinedData(): CombinedData = coroutineScope {
val users = async(Dispatchers.IO) { api.getUsers() }
val posts = async(Dispatchers.IO) { api.getPosts() }
CombinedData(users.await(), posts.await())
}viewModelScope.launch — ViewModel 中的标准协程启动。withContext(Dispatchers.IO) — 切换到 IO 线程进行网络请求。Dispatchers 决定协程在哪个线程池上执行。IT Sectr 建议 ViewModel 使用 viewModelScope,Activity/Fragment 使用 lifecycleScope。
reified — inline 函数中的类型修饰符。允许使用类型:T::class、is T、as T。没有 reified,JVM 中的泛型会被擦除(类型擦除)。inline fun + reified — 用于类型安全 API 的强大组合。Destructuring Declaration — val (x, y) = point。适用于 data class 和具有 componentN() 的类型。typealias — 类型别名:typealias Callback = (String) -> Unit。lateinit — var 的延迟初始化(用于依赖注入)。非线程安全。lazy — val 的惰性初始化(默认线程安全)。lazy(LazyThreadSafetyMode.NONE) — 无同步。Extension function 和 Extension property — 无需继承即可添加功能。Kotlin 是一种扩展函数解决 90% 工具任务的语言。
Delegated Properties — 将 getter/setter 委托给另一个对象。标准委托:lazy、observable、vetoable、map。通过 getValue/setValue 操作符自定义委托。by — 委托关键字:val name by lazy { loadName() }。委托属性是 ViewModel 委托(by viewModels())的基础。IT Sectr 建议对延迟初始化使用 lazy,对观察更改使用 Delegates.observable。
| 功能 | 描述 | 示例 |
|---|---|---|
| reified | 在 inline 中保留泛型类型 | inline fun <reified T> parse(): T |
| destructuring | 解包 data class | val (name, age) = person |
| typealias | 类型别名 | typealias Orders = List<Order> |
| lateinit | var 的延迟初始化 | lateinit var adapter: Adapter |
| lazy | val 的惰性初始化 | val config by lazy { load() } |
| delegated | 属性委托 | var x by Delegates.observable(0) |
reified — 用于类型安全 API。lazy — 用于延迟加载。delegated properties — 用于重用属性逻辑。IT Sectr 建议掌握所有这些功能以实现高效的 Kotlin 开发。
Flow — Kotlin 中的冷异步数据流。根据收集器的请求发出值。StateFlow — 具有单一当前值的热 Flow。在 ViewModel 中用于 UI State。SharedFlow — 用于事件的热 Flow(一次性事件)。flowOf、asFlow — 从集合创建 Flow。catch、retry、debounce — 操作符。stateIn、shareIn — 将冷 Flow 转换为热 Flow。IT Sectr 建议 UI State 使用 StateFlow,事件(Snackbar、导航)使用 SharedFlow。
class SearchViewModel : ViewModel() {
private val _query = MutableStateFlow("")
val suggestions: StateFlow<List<String>> = _query
.debounce(300)
.filter { it.length >= 2 }
.flatMapLatest { repository.search(it) }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList())
fun onQueryChanged(query: String) {
_query.value = query
}
}kotlinx.serialization — 用于 JSON 序列化的 Kotlin 库。@Serializable — 注解。@SerialName — 自定义字段名。支持:JSON、CBOR、ProtoBuf。Parcelize — 用于 Android Parcelable 的 @Parcelize(无需手动实现)。Gson vs Moshi vs kotlinx:kotlinx.serialization — Kotlin 优先、编译安全、无反射。Moshi — 注解 + codegen。IT Sectr 建议新项目使用 kotlinx.serialization,现有项目使用 Moshi。
@Serializable
data class ApiResponse<T>(
val success: Boolean,
@SerialName("data") val data: T? = null,
val error: String? = null
)
@Serializable
data class User(
val id: Int,
val name: String,
val email: String
)
// 反序列化
val json = Json { ignoreUnknownKeys = true }
val response = json.decodeFromString<ApiResponse<List<User>>>(jsonString)
println("Users: ${response.data?.size ?: 0}")常见问题
data class — 用于数据(自动生成 equals/hashCode/copy)。sealed class — 用于类型层次结构(在 when 中检查)。sealed interface — 支持多重继承的相同功能。
let、run、with、apply、also。根据上下文(it vs this)和返回值(result vs context)区分。let — 空安全,apply — 配置,also — 副作用。
CoroutineScope — 协程的作用域。lifecycleScope — 用于 Activity,viewModelScope — 用于 ViewModel。GlobalScope — 不推荐。
reified — 在 inline 函数中保留类型。允许 T::class 和 is T。仅适用于 inline 函数。
launch — 无结果。async — 带结果(Deferred)。runBlocking — 用于 main/test 的阻塞桥接。withContext — 切换 Dispatcher。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。