深入浅出Kotlin关键字

253 阅读5分钟

在 Android 开发中,Kotlin 的关键字(Keywords)是编写高效、安全代码的基础工具。Kotlin 的关键字可以分为 硬关键字(Hard Keywords)软关键字(Soft Keywords)修饰符关键字(Modifier Keywords) 三大类。下面用最直观的方式解析这些关键字的作用和实际应用场景,并附上 Android 开发的典型示例。


一、Kotlin 关键字分类速查表

1. 硬关键字(Hard Keywords)

这些关键字在 Kotlin 中有严格的意义,不能用作变量名、函数名等标识符。

关键字作用Android 典型应用场景
as类型转换view as TextView(安全转换)
break跳出循环for (i in 1..10) { if (i == 5) break }
class定义类class MainActivity : AppCompatActivity()
continue跳过当前循环for (i in 1..10) { if (i % 2 == 0) continue }
do循环结构do { ... } while (condition)
else条件分支if (isLoggedIn) showHome() else showLogin()
false布尔假值val isEnabled = false
for循环遍历for (item in list) { ... }
fun定义函数fun onCreate(savedInstanceState: Bundle?)
if条件判断if (data != null) updateUI(data)
in范围检查if (index in 0..list.size)
interface定义接口interface OnClickListener { fun onClick() }
is类型检查if (view is Button) { view.text = "Click" }
null空值var name: String? = null
object单例对象object RetrofitClient { ... }
package包声明package com.example.myapp
return返回值fun sum(a: Int, b: Int): Int { return a + b }
super调用父类super.onCreate(savedInstanceState)
this当前对象this@MainActivity
throw抛出异常throw IllegalArgumentException("Invalid input")
true布尔真值val isVisible = true
try异常捕获try { riskyOperation() } catch (e: Exception) { ... }
typealias类型别名typealias ClickListener = (View) -> Unit
val不可变变量val PI = 3.14
var可变变量var currentPage = 1
when多条件分支when (view.id) { R.id.btn_ok -> ... }
while循环结构while (isLoading) { ... }

2. 软关键字(Soft Keywords)

这些关键字在特定上下文中是关键字,其他情况下可以用作标识符。

关键字作用Android 典型应用场景
by委托模式private val viewModel: MainViewModel by viewModels()
catch捕获异常try { ... } catch (e: IOException) { ... }
constructor构造函数class User(val name: String)
delegate委托属性val lazyValue by lazy { ... }
dynamic动态类型(JS 目标平台)一般不用于 Android
field幕后字段var counter = 0; set(value) { field = value }
file文件级声明@file:JvmName("Utils")
finally最终执行块try { ... } finally { releaseResources() }
getGetter 方法val isEmpty get() = size == 0
import导入声明import android.os.Bundle
init初始化块init { Log.d("TAG", "Initialized") }
param参数标记一般不直接使用
property属性声明一般不直接使用
receiver接收者参数fun String.print() { println(this) }
setSetter 方法var name: String = ""; set(value) { field = value }
setparamSetter 参数一般不直接使用
where泛型约束fun <T> copyWhenGreater(list: List<T>, threshold: T) where T : CharSequence, T : Comparable<T>

3. 修饰符关键字(Modifier Keywords)

这些关键字用于修饰类、函数、属性等。

关键字作用Android 典型应用场景
abstract抽象类/方法abstract class BaseFragment : Fragment()
actual多平台实现一般不用于纯 Android 项目
annotation定义注解@Retention(AnnotationRetention.RUNTIME)
companion伴生对象companion object { const val TAG = "MainActivity" }
const编译时常量const val API_URL = "https://api.example.com"
crossinline禁止非局部返回inline fun runOnUiThread(crossinline action: () -> Unit)
data数据类data class User(val name: String, val age: Int)
enum枚举类enum class Theme { LIGHT, DARK }
expect多平台声明一般不用于纯 Android 项目
external外部声明external fun nativeMethod(): Int
final禁止继承final class Utils
infix中缀函数infix fun Int.add(x: Int) = this + x
inline内联函数inline fun <T> measureTime(block: () -> T): T
inner内部类inner class ViewHolder(itemView: View)
internal模块内可见internal fun utilsMethod()
lateinit延迟初始化lateinit var recyclerView: RecyclerView
noinline禁止内联inline fun foo(noinline block: () -> Unit)
open允许继承open class BaseActivity : AppCompatActivity()
operator操作符重载operator fun plus(other: Point): Point
out协变interface Source<out T>
override重写方法override fun onCreate(savedInstanceState: Bundle?)
private私有可见性private val secretKey = "123"
protected保护可见性protected open fun setupViews()
public公开可见性public fun showToast(message: String)
reified具体化类型参数inline fun <reified T> Gson.fromJson(json: String): T
sealed密封类sealed class Result<out T>
suspend挂起函数suspend fun fetchData(): Data
tailrec尾递归优化tailrec fun factorial(n: Int, acc: Int = 1): Int
vararg可变参数fun printAll(vararg messages: String)

二、Android 开发中最关键的 10 个关键字详解

1. val vs var

// 布局ID应该用val(不可变)
val btnSubmit: Button = findViewById(R.id.btn_submit)

// 用var存储可能变化的数据
var currentPage = 1  // 分页页码会变

最佳实践:优先使用 val 保证线程安全。

2. lateinit

// 避免在onCreate前初始化View
private lateinit var recyclerView: RecyclerView

override fun onCreate() {
    recyclerView = findViewById(R.id.recycler_view)
}

注意:使用前需检查 ::recyclerView.isInitialized

3. by

// ViewModel委托
private val viewModel: MainViewModel by viewModels()

// 懒加载
val heavyObject by lazy { HeavyObject() }

4. companion object

class MyFragment : Fragment() {
    companion object {
        fun newInstance() = MyFragment()
    }
}

5. suspend

// 网络请求必须标记suspend
suspend fun fetchUser(): User {
    return withContext(Dispatchers.IO) {
        api.getUser()
    }
}

6. data class

// 自动生成equals/hashCode/toString等
data class User(val id: Long, val name: String)

7. sealed class

// 完美处理UI状态
sealed class LoginState {
    object Loading : LoginState()
    data class Success(val user: User) : LoginState()
    data class Error(val message: String) : LoginState()
}

8. @JvmStatic

companion object {
    @JvmStatic
    fun staticMethod() {}
}

9. inline + crossinline

// 优化高阶函数性能
inline fun View.onClick(crossinline action: () -> Unit) {
    setOnClickListener { action() }
}

10. reified

// 避免类型擦除
inline fun <reified T> fromJson(json: String): T {
    return Gson().fromJson(json, T::class.java)
}

三、需要警惕的关键字陷阱

1. !! 非空断言

// 危险!可能NPE
val text = editText.text!!.toString()

// 安全做法
val text = editText.text?.toString() ?: ""

2. open 继承控制

// 除非明确需要继承,否则类默认final
open class BaseActivity : AppCompatActivity()

3. var 可变性

// 除非必要,否则优先用val
var globalConfig = Config() // 可能被意外修改

四、关键字最佳实践组合

1. 协程+挂起函数

viewModelScope.launch {
    try {
        val data = repository.loadData()
        withContext(Dispatchers.Main) {
            adapter.submitList(data)
        }
    } catch (e: Exception) {
        showError(e)
    }
}

2. 数据类+密封类

data class User(val id: String, val name: String)

sealed class ApiResult<out T> {
    data class Success<T>(val data: T) : ApiResult<T>()
    data class Error(val message: String) : ApiResult<Nothing>()
}

掌握这些关键字后,你的Android代码将: ✅ 更安全(减少NPE和类型错误) ✅ 更高效(利用编译器优化) ✅ 更简洁(代码量减少50%+) ✅ 更易维护(更好的架构和扩展性)