一、前言
我们经常能够在 Java 相关技术博客中看到类似这样的文章: Java 中 X 种单例模式的写法。的确,单例模式是一个简单但又很重要的设计模式,特别是在多线程编程中,它的实现方法各有不同,也是适应各种不同的场合。不过,现在有了 Kotlin ,那都不是事了,忘记那个 X 吧,一个 object
关键字轻松搞定!真的,相信我,生活就是要那么容易。 :sunglasses:
在 Kotlin 中,除了 object
关键字还有个 companionobject
关键字,这个又是什么鬼?怎么使用?有啥区别?在没有仔细阅读相关文档资料之前还真有点傻傻分不清了。实践出真知,在经过简单的练习加上相关博客文章、源码阅读、谷歌搜索后,我心里所认识的 object
和 companionobject
是这样的:
object 可以定义在全局也可以在类的内部使用
object 就是单例模式的化身
object 可以实现 Java 中的匿名类
companion object 就是 Java 中的 static 变量
companion object 只能定义在对应的类中
但是,这些认识都是停留在表面上,在我继续阅读《 Kotlin in Action 》这本书相应章节后,我能发现它们的使用场景和功能点远不止这些!究其原因,主要是我并没有完全弄清楚它们的原理以及它们之间的差别,不论是 object
还是 companionobject
,它们的共性和区别还有这些:
object 可以作为变量的定义也可以是表达式
object 匿名类可以继承并超越 Java 中匿名类而实现多个接口
object 表达式当场实例化,但定义的 object 变量是延迟实例化的
object 和 companion object 都可以为其取名也可以隐姓埋名
object 匿名内部类甚至可以引用并更改局部变量
companion object 甚至还可以被扩展
Java 中需要结合 @JvmStatic 和 @JvmField 使用
…… 还有很多异同点等着你的开发
既然这俩兄弟有这么多异同点,那么我觉得非常有必要总结一下,以便将来能够更加得心应手地使用 Kotlin 吧。
二、正文
1. object基本定义
object
可以轻松实现 Kotlin 单例模式, 它可以定义在全局之中,也可以定义在类的内部。但是要注意几点:
object 定义后即刻实例化
因此 object 不能有定义构造函数
定义在类内部的 object 并不能访问类的成员
object OutObject {
val outParameter = "out"
fun outFunction(parameter:String) {
println("Out object function result: $parameter.")
}
}
class MyClass {
val classParameter = "class"
object InnerObject {
//val innerParameter = this.classParameter //error: 1,this refers to InnerObject 2,classParameter cannot be reached
val innerParameter = "inner"
fun innerFunction(parameter:String) {
println("Out object function result: $parameter.")
}
}