属性和字段
1、声明属性
Kotlin中可以使用var
关键字声明可变属性,或者用val
关键字声明只读属性,属性的类型在后面,变量名在前面,中间加冒号和空格。
public class Address { public var name: String = ... public var street: String = ... public var city: String = ... public var state: String? = ... public var zip: String = ... }
调用的时候与Java一样,通过变量名直接使用一个属性
fun copyAddress(address: Address): Address { val result = Address() // Kotlin不需要使用new关键字 result.name = address.name result.street = address.street // ... return result }
2、Getter和Setter
声明属性的完整语法如下,语法中的初始化语句,getter
和setter
都是可选的
var <propertyName>: <PropertyType> [= <property_initializer>] [<getter>] [<setter>]
如果属性类型可以从初始化语句或者类的成员函数中推断出来,那就可以省去类型,val
不允许设置setter
函数,因为它是只读的。
var allByDefault: Int? // 错误: 需要一个初始化语句, 默认实现了 getter 和 setter 方法 var initialized = 1 // 类型为 Int, 默认实现了 getter 和 setter val simple: Int? // 类型为 Int ,默认实现 getter ,但必须在构造函数中初始化 val inferredType = 1 // 类型为 Int 类型,默认实现 getter
可以自定义访问器(getter
)和自定义setter
,setter
的参数名默认是value
,也可以自定义
val isEmpty: Boolean get() = this.size == 0 var stringRepresentation: String get() = this.toString() set (value) { setDataFormString(value) // 格式化字符串,并且将值重新赋值给其他元素 }
如果需要设置访问器的可见性或者设置注解,又不改变原来的实现,则可以设置一个不带函数的访问器
var setterVisibility: String = "abc" // 非空类型必须初始化 private set // setter是私有的并且有默认的实现 var setterWithAnnotation: Any? = null // 设置为可空 @Inject set // 用 Inject 注解 setter