Kotlin专题Kotlin编程禅与计算机程序设计艺术

【第6篇】Kotlin的属性与字段详解

2019-06-20  本文已影响2人  爱学习的蹭蹭

1、声明属性

class Address {
    var name: String = ""//地址名称
    var street: String = ""//街道
    var city: String =""//城市名称
    var state: String? ="" //状态可以为空null
    var zip: String =""//邮政编码
}
fun copyAddress(address: Address): Address {
    val result = Address() // Kotlin 中没有“new”关键字
    result.name = address.name // 将调用访问器
    result.street = address.street
    // ……
    return result
}

*声明一个属性的完整语法是

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]
var allByDefault: Int? // 错误:需要显式初始化器,隐含默认 getter 和 setter
var initialized = 1 // 类型 Int、默认 getter 和 setter
val simple: Int? // 类型 Int、默认 getter、必须在构造函数中初始化
val inferredType = 1 // 类型 Int 、默认 getter
val isEmpty: Boolean
    get() = this.size == 0
var stringRepresentation: String
    get() = this.toString()
    set(value) {
        setDataFromString(value) // 解析字符串并赋值给其他属性
    }
val isEmpty get() = this.size == 0  // 具有类型 Boolean
var setterVisibility: String = "abc"
    private set // 此 setter 是私有的并且有默认实现

var setterWithAnnotation: Any? = null
    @Inject set // 用 Inject 注解此 setter

3、幕后字段

var counter = 0 // 注意:这个初始器直接为幕后字段赋值
    set(value) {
        if (value >= 0) field = value
    }
val isEmpty: Boolean
    get() = this.size == 0

4、幕后属性

private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
    get() {
        if (_table == null) {
            _table = HashMap() // 类型参数已推断出
        }
        return _table ?: throw AssertionError("Set to null by another thread")
    }

5、编译期常量

已知值的属性可以使用 const 修饰符标记为 编译期常量。 这些属性需要满足以下要求:

const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
@Deprecated(SUBSYSTEM_DEPRECATED) fun foo() { …… }

6、延迟初始化属性与变量

public class MyTest {
    lateinit var subject: TestSubject

    @SetUp fun setup() {
        subject = TestSubject()
    }

    @Test fun test() {
        subject.method()  // 直接解引用
    }
}

1、该修饰符只能用于在类体中的属性(不是在主构造函数中声明的 var 属性,并且仅当该属性没有自定义 getter 或 setter 时),而自 Kotlin 1.2 起,也用于顶层属性与局部变量。该属性或变量必须为非空类型,并且不能是原生类型。
2、在初始化前访问一个 lateinit 属性会抛出一个特定异常,该异常明确标识该属性被访问及它没有初始化的事实。
3、检测一个 lateinit var 是否已初始化(自 1.2 起)

if (foo::bar.isInitialized) {
    println(foo.bar)
}

7、覆盖属性

参见覆盖属性

8、委托属性


文章来自koltin英文社区
文章来自koltin中文社区

上一篇 下一篇

猜你喜欢

热点阅读