声明一个属性的完整语法是
var [: ] [= ]
[]
[]
PropertyType、property_initializer、getter、setter均是可选的元素,这里再强调下,val类型变量为可读变量,所以只拥有get方法,而var类型则有get/set方法。这里直接自定义Student类的birthday的get/set方法
class Student {
...
var age: Int?//自定义get/set方法
get() = field //使用备用字段自定义get/set方法
set(value) {//value是自定义的变量名,名字可以随便起
age = value
}
...
}
Kotlin 的接口与 Java 8 类似,既包含抽象方法的声明,也包含实现。与抽象类不同的是,接口无法保存状态。它可以有属性但必须声明为抽象或提供访问器实现。
public interface SomeInterface{
var value:String //默认abstract
fun reading() // 未实现
fun writing(){ //已实现
// do nothing
}
}
class MyImpl:SomeInterface{
override var value: String = "jason" //重载属性
override fun reading() {
// 方法体
}
}
枚举类的最基本的用法是实现类型安全的枚举
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
每个枚举常量都是一个对象。枚举常量用逗号分隔。
使用:
var color:Color=Color.BLUE
println(Color.values())
println(Color.valueOf("RED"))
println(color.name)
println(color.ordinal)//返回下标
委托模式是一个很有用的模式,它可以用来从类中抽取出主要负责的部分。委托模式是Kotlin原生支持的,所以它避免了我们需要去调用委托对象。委托者只需要指定实现的接口的实例。
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b
fun main(args: Array) {
val b = BaseImpl(10)
Derived(b).print() // 输出 10
}
在 Derived 声明中,by 子句表示,将 b 保存在 Derived 的对象实例内部,而且编译器将会生成继承自 Base 接口的所有方法, 并将调用转发给 b。
kotlin通过属性委托的方式,为我们实现了一些常用的功能,包括:
延迟属性我们应该不陌生,也就是通常说的懒汉。
//标准委托 延迟属性
val lazyValue : String by lazy {
Log.d("m", "只执行1次")
"value"
}
println(lazyValue)
println(lazyValue)
//执行
D/m: 只执行1次
I/System.out: value
I/System.out: value
Delegates.observable() 接受两个参数:初始值和修改时处理程序(handler)。 每当我们给 属性赋值时会调用该处理程序(在赋值后执行)。它有三个参数:被赋值的属性、旧值和新 值:
class User {
var name: String by Delegates.observable("") {
prop, old, new ->
println("$old -> $new")
}
}
//可观察属性 Observable
val user = User()
user.name = "first"
user.name = "second"
//执行结果
I/System.out: -> first
I/System.out: first -> second
一个常见的用例是在一个映射(map)里存储属性的值。 这经常出现在像解析 JSON 或者做其他“动态”事情的应用中。 在这种情况下,你可以使用映射实例自身作为委托来实现委托属性。
class MapUser(val map: Map) {
val name: String by map
val age: Int by map
}
//把属性储存在映射
val userMap = MapUser(mapOf(
"name" to "小七",
"age" to 21
))
println(userMap.name)
println(userMap.age)
//执行结果
I/System.out: 小七
I/System.out: 21