跳转到内容

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更新...
    }
}

属性与字段对比[编辑 | 编辑源代码]

classDiagram class Property { +name: String +getter() +setter() } class Field { +value: Any } Property --> Field : 使用

数学表示[编辑 | 编辑源代码]

属性访问可以表示为函数:

  • Getter: get():T
  • Setter: set(value:T):Unit

其中T是属性类型。

总结[编辑 | 编辑源代码]

Kotlin属性提供了比Java字段更强大的功能: 1. 内置getter/setter简化语法 2. 支持计算属性和自定义访问逻辑 3. 通过委托实现复杂行为 4. 延迟初始化选项

这些特性使Kotlin属性成为构建健壮、可维护代码的重要工具。