Kotlin:可变或者不可变的属性的使用
2017-09-13 本文已影响211人
1024工场
一、声明属性
- Kotlin类可以有属性,属性可以用关键字var声明为可变的,否则使用只读关键字val;
- 使用属性,只要用名称引用它即可;
class Address {
//1.声明可变var可变属性,val只读属性
var name: String = ……
var street: String = ……
var city: String = ……
var state: String? = ……
var zip: String = ……
}
fun copyAddress(address: Address): Address {
val result = Address()
//2.用名称引用即可,将调用访问器
result.name = address.name
result.street = address.street
// ……
return result
}
二、Getters与Setters
- 声明一个属性的完整语法如下:
初始化器(initializer)、getter和setter都是可选的;
属性类型可以从初始器(从getter返回值)中推断出来,也可以省略;
var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]
- 只读属性和可变属性不同:只读用val,可变用var;只读不允许setter;
- 编写自定义的访问器,像普通函数,在属性声明内部;
- 改变访问器可见性或者对其注解,但不改变默认实现,可以定义访问器而不定义其实现;
//2.可变属性var,类型 Int、默认 getter 和 setter
var initialized = 1
//2.只读属性val,类型 Int 、默认 getter
val inferredType = 1
//3.自定义访问器getter和setter,按照惯例setter参数的名称是value
var stringRepresentation: String
get() = this.toString()
set(value) {
setDataFromString(value) // 解析字符串并赋值给其他属性
}
//4.此 setter 是私有的并且有默认实现,用 Inject 注解此 setter
var setterVisibility: String = "abc"
private set
var setterWithAnnotation: Any? = null
@Inject set
- Kotlin不能有字段,当使用自定义访问器时,有一个幕后字段有时是有必要的,通过field标识符访问;
var counter = 0
set(value) {
if (value >= 0)
//5.此初始器值直接写入到幕后字段,field标识符智能在属性的访问器内
field = value
}
三、编译期常量
- 已知值的属性可以使用const修饰符标记为编译期常量,属性要位于顶层或者object的一个成员,用String或原生类型初始化,没有自定义getter;
const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
@Deprecated(SUBSYSTEM_DEPRECATED) fun foo() { …… }
四、延迟初始化属性
- 一般地,属性声明为非空类型必须在构造函数初始化,然而通过依赖注入初始化,或者单元测试setup方法初始化时经常不方便;
- 使用lateinit修饰符标记该属性,只能用于在类体中声明的var属性,当且仅当属性没自定义getter或setter时,属性必须是非空类型,并且不能是原生类型;
public class MyTest {
lateinit var subject: TestSubject
@SetUp fun setup() {
subject = TestSubject()
}
@Test fun test() {
subject.method() // 直接解引用
}
}
1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)
2.加入“Kotlin开发”QQ讨论群,一起学习一起Hi。(甭客气!尽情的扫描或者长按!)
Kotlin开发群