博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kotlin------类和对象(二)
阅读量:5817 次
发布时间:2019-06-18

本文共 2671 字,大约阅读时间需要 8 分钟。

hot3.png

get/set方法

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

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 bfun main(args: Array
) { val b = BaseImpl(10) Derived(b).print() // 输出 10}

在 Derived 声明中,by 子句表示,将 b 保存在 Derived 的对象实例内部,而且编译器将会生成继承自 Base 接口的所有方法, 并将调用转发给 b。

 委托属性

kotlin通过属性委托的方式,为我们实现了一些常用的功能,包括:

  1. 延迟属性(lazy properties): 其值只在首次访问时计算,
  2. 可观察属性(observable properties): 监听器会收到有关此属性变更的通知,
  3. 把多个属性储存在一个映射(map)中,而不是每个存在单独的字段中。

延迟属性

延迟属性我们应该不陌生,也就是通常说的懒汉。

//标准委托 延迟属性    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

可观察属性 Observable

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: 
-> firstI/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

 

转载于:https://my.oschina.net/zhangqie/blog/1531608

你可能感兴趣的文章
线性表4 - 数据结构和算法09
查看>>
C语言数据类型char
查看>>
Online Patching--EBS R12.2最大的改进
查看>>
Binary Search Tree Iterator leetcode
查看>>
Oracle性能优化--DBMS_PROFILER
查看>>
uva-317-找规律
查看>>
Event事件的兼容性(转)
查看>>
我的2014-相对奢侈的生活
查看>>
zoj 2412 dfs 求连通分量的个数
查看>>
Java设计模式
查看>>
一文读懂 AOP | 你想要的最全面 AOP 方法探讨
查看>>
Spring Cloud 微服务分布式链路跟踪 Sleuth 与 Zipkin
查看>>
ORM数据库框架 SQLite 常用数据库框架比较 MD
查看>>
华为OJ 名字美丽度
查看>>
微信公众号与APP微信第三方登录账号打通
查看>>
onchange()事件的应用
查看>>
Windows 下最佳的 C++ 开发的 IDE 是什么?
查看>>
软件工程师成长为架构师必备的十项技能
查看>>
python 异常
查看>>
百度账号注销
查看>>