Kotlin属性
外观
Kotlin属性[编辑 | 编辑源代码]
Kotlin属性是面向对象编程中的核心概念之一,用于表示类的状态或特征。在Kotlin中,属性不仅存储数据,还可以通过自定义的访问器(getter和setter)控制其读写行为。与Java不同,Kotlin属性更加简洁且功能强大,减少了样板代码的需求。
基本语法[编辑 | 编辑源代码]
Kotlin属性的声明语法如下:
class Person {
var name: String = "John" // 可变属性
val age: Int = 30 // 只读属性
}
- var:声明可变属性(可读可写)
- val:声明只读属性(只能读取,不能修改)
访问属性[编辑 | 编辑源代码]
属性可以通过对象实例直接访问:
fun main() {
val person = Person()
println(person.name) // 输出: John
person.name = "Alice" // 修改name属性
println(person.name) // 输出: Alice
println(person.age) // 输出: 30
// person.age = 31 // 编译错误:val不能重新赋值
}
自定义访问器[编辑 | 编辑源代码]
Kotlin允许为属性定义自定义的getter和setter,从而在访问或修改属性时执行额外的逻辑。
自定义Getter[编辑 | 编辑源代码]
class Rectangle(val width: Int, val height: Int) {
val area: Int
get() = width * height // 计算属性
}
使用示例:
fun main() {
val rect = Rectangle(10, 20)
println(rect.area) // 输出: 200
}
自定义Setter[编辑 | 编辑源代码]
class User {
var name: String = ""
set(value) {
if (value.isNotBlank()) {
field = value // 使用field关键字引用幕后字段
}
}
}
使用示例:
fun main() {
val user = User()
user.name = " " // 不会被设置
println(user.name) // 输出: ""
user.name = "Alice"
println(user.name) // 输出: Alice
}
幕后字段(Backing Field)[编辑 | 编辑源代码]
在Kotlin中,每个属性默认都有一个幕后字段(用`field`关键字引用),它存储属性的实际值。当需要直接访问存储的值时(如在自定义访问器中),可以使用`field`。
class Counter {
var count: Int = 0
set(value) {
if (value >= 0) {
field = value
}
}
}
延迟初始化属性[编辑 | 编辑源代码]
对于非空属性,如果不能在构造函数中初始化,可以使用`lateinit`修饰符标记为延迟初始化:
class Service {
lateinit var api: ApiClient
fun initialize() {
api = ApiClient.create()
}
}
注意:
- 只能用于`var`属性
- 不能用于基本类型(如Int、Boolean等)
- 访问未初始化的`lateinit`属性会抛出`UninitializedPropertyAccessException`
属性委托[编辑 | 编辑源代码]
Kotlin支持通过委托属性将属性的读写操作委托给另一个对象。标准库提供了`lazy`、`observable`等常用委托。
lazy委托[编辑 | 编辑源代码]
延迟计算属性值(首次访问时计算):
val heavyObject: HeavyObject by lazy {
println("Initializing heavy object...")
HeavyObject() // 仅在第一次访问时执行
}
observable委托[编辑 | 编辑源代码]
监听属性变化:
import kotlin.properties.Delegates
class User {
var name: String by Delegates.observable("<no name>") {
prop, old, new ->
println("$old -> $new")
}
}
使用示例:
fun main() {
val user = User()
user.name = "Alice" // 输出: <no name> -> Alice
user.name = "Bob" // 输出: Alice -> Bob
}
实际应用案例[编辑 | 编辑源代码]
案例1:数据验证[编辑 | 编辑源代码]
class BankAccount {
var balance: Double = 0.0
set(value) {
require(value >= 0) { "Balance cannot be negative" }
field = value
}
}
案例2:UI状态管理[编辑 | 编辑源代码]
class ViewModel {
private var _loading = false
val loading: Boolean
get() = _loading
fun startLoading() {
_loading = true
// 触发UI更新...
}
}
属性与字段对比[编辑 | 编辑源代码]
数学表示[编辑 | 编辑源代码]
属性访问可以表示为函数:
- Getter:
- Setter:
其中是属性类型。
总结[编辑 | 编辑源代码]
Kotlin属性提供了比Java字段更强大的功能: 1. 内置getter/setter简化语法 2. 支持计算属性和自定义访问逻辑 3. 通过委托实现复杂行为 4. 延迟初始化选项
这些特性使Kotlin属性成为构建健壮、可维护代码的重要工具。