Kotlin Reference (九) Properties and Fields
来源:互联网 发布:侠客风云传低配置优化 编辑:程序博客网 时间:2024/05/21 07:58
most from reference
声明属性
Koltin的类都有属性,这些属性可以声明为可变的,使用var关键字或用val关键字生声明不可变属性。
class Address { var name: String = ... var street: String = ... var city: String = ... var state: String? = ... var zip: String = ...}
要使用一个属性,我们简单地通过名称引用他,就好像Java中的一个字段:
fun copyAddress(address: Address): Address { val result = Address() // there's no 'new' keyword in Kotlin result.name = address.name // accessors are called result.street = address.street // ... return result}
Getters and Setters
声明属性的完整语法是:
var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>]
初始化程序,getter和setter是可选的,如果可以从初始化程序(或从getter返回类型,如下所示)推断属性类型,则属性类型时可选的。
例子:
var allByDefault: Int? // error: explicit initializer required, default getter and setter impliedvar initialized = 1 // has type Int, default getter and setter
只读属性声明的完整语法与可变的属性声明的不同之处有两点:①关键字是val ② 不允许set重新赋值
val simple: Int? // has type Int, default getter, must be initialized in constructorval inferredType = 1 // has type Int and a default getter
我们可以在一个属性声明中写出自定义setter,非常像普通功能。一下是一个定制getter的例子:
val isEmpty: Boolean get() = this.size == 0
自定义setter如下所示:
var stringRepresentation: String get() = this.toString() set(value) { setDataFromString(value) // parses the string and assigns values to other properties }
按惯例,setter参数的名称是value,也可以选择其他名称。
从Kotlin1.1起,如果可以从getter推断属性类型,则可以省略它:
val isEmpty get() = this.size == 0 // has type Boolean
如果您需要更改访问器或者注释它,但不需要更改默认实现,则可以定义访问器而不定义其主体:
var setterVisibility: String = "abc" private set // the setter is private and has the default implementationvar setterWithAnnotation: Any? = null @Inject set // annotate the setter with Inject
后备字段
Kotlin中的类不用有字段,但是,有时在使用自定义访问器时需要一个后备字段。所以,kotlin提供了一个可以使用field关键字标识符访问的自动备份字段:
var counter = 0 // the initializer value is written directly to the backing field set(value) { if (value >= 0) field = value } ``` field标识符只能在属性的访问中使用。 如果属性使用至少一个访问器的默认实现,或者自定义访问器通过field标识符引用它,则将为属性生成后备字段。 例如,在以下情况下,将不会有后备字段: ``` val isEmpty: Boolean get() = this.size == 0
后备属性
如果你想做一些不符合这个“隐性支持字段”方案的东西,你总是可以回到拥有一个后备属性:
private var _table: Map<String, Int>? = nullpublic val table: Map<String, Int> get() { if (_table == null) { _table = HashMap() // Type parameters are inferred } return _table ?: throw AssertionError("Set to null by another thread") }
与Java中一样,因为使用默认getter和setter的私有属性的访问优化,因为不会引入函数调用开销。
编译时常数
在编译时已知其值的属性可以使用修饰符标记为编译时常数const。这些属性需要满足以下要求:
- 顶级或成员 object
- 用类型String或原始类型的值初始化
- 没有自定义的getter方法
这些属性可以在注释中使用:
const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"@Deprecated(SUBSYSTEM_DEPRECATED) fun foo() { ... }
后期初始化属性
通常,声明为非空类型的属性必须在构造函数中进行初始化。然而,这通常不方便。例如,可以通过依赖注入或单元测试的设置方法初始化属性。在这种情况下,您不能在构造函数中提供非空的初始值设置,但是您仍然希望在引用类的正文中的属性时避免空检查。
要处理这种情况,您可以使用lateinit修饰符标记属性:
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() // dereference directly }}
修饰符只能用于在var一个类的主体内声明的属性(不在主构造函数中),只有在该属性没有自定义的getter或setter 时才可以使用。属性的类型必须为非空值,并且不能为原始类型。
lateinit在初始化之前访问一个属性会引发一个特殊的异常,它清楚地标识被访问的属性以及它还没被初始化的事实。
覆盖属性
请参考覆盖属性
委托属性
最常见的属性只是读取(也可能写入)支持字段。另一方面,使用定制getter和setter可以实现属性的任何行为。中间的某个地方,财产如何运作有一些共同的模式。几个例子:懒惰值,通过给定的键读取地图,访问数据库,通知访问者等。
这样的常见行为可以使用委托属性作为库来实现。
- Kotlin Reference (九) Properties and Fields
- Kotlin属性和变量-2.2-Properties and Fields
- Kotlin-09.类属性和字段(Properties/Fields)
- Kotlin Reference (九) 抽象类、密封类
- Kotlin Reference (七) Returns and Jumps
- Kotlin Reference (八) Classes and Objects
- Advanced searching - fields reference
- Kotlin Reference (三) Basic Types, String, Array and Imports
- Kotlin Reference (十三) Data Class and Sealed Classes
- Kotlin(九)
- Reference Pivot Fields and Pivot Items in an Excel Pivot Table, using VBA
- Kotlin Reference (六) 接口
- kotlin Unresolved reference: kotlinx
- Kotlin Reference (二) Idioms
- Kotlin Reference (五) Packages
- Kotlin Reference (十) Interfaces
- Kotlin Reference (十二) Extensions
- Kotlin Reference (十四) Generics
- : Andorid的Linux基础教学之五 中断机制
- 软件开发模型
- 关于Android沉浸式状态栏的解决方法之一(伪沉浸式)
- 使用git pull文件时和本地文件冲突怎么办?
- Android之linux基础教学之六 异常
- Kotlin Reference (九) Properties and Fields
- 把idea的项目上传的gitlab上
- hdu 1402 A * B Problem Plus(FFT-大整数乘法)
- Android之linux基础教学之七 中断下半部之软中断
- HDU 6073 Matching In Multiplication(机智)
- 大话数据结构 code 第七章 05最小生成树_Prim
- C++中的STL中map用法详解
- Http协议详解
- 面包会有的,牛奶也会有的