单例
Kotlin中没有static关键字,如果需要实现单例功能,
你可以使用关键字 object 声明一个对象,对象的构造器不能提供构造器参数;在第一次使用的时候会被初始化,可用于提供常量或共享不可变对象!具体可以仿照官网
单例模式是一种非常有用的模式,而 Kotlin(继 Scala 之后)使单例声明变得很容易:
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ……
}
val allDataProviders: Collection<DataProvider>
get() = // ……
}
这称为对象声明。并且它总是在 object 关键字后跟一个名称。 就像变量声明一样,对象声明不是一个表达式,不能用在赋值语句的右边。
要引用该对象,我们直接使用其名称即可:
object DefaultListener : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ……
}
override fun mouseEntered(e: MouseEvent) {
// ……
}
}
注意:对象声明不能在局部作用域(即直接嵌套在函数内部),但是它们可以嵌套到其他对象声明或非内部类中。
不过我个人的习惯还是使用枚举的方式
enum class Sington{
mSington;
fun usrSington(){}
}
伴生对象
对想我这样刚接触kotlin的java程序员来说,伴生对象是一个陌生的概念。这几天也一直在转变思想。我的理解是这样的:
虽然kotlin为了更好的面向对象取消了static关键字,但是有时我们也需要在class一级作出一个写操作,因为此在kotlin中出现了companion
关键字。在
companion object{
......
}
数据块中的属性或者方法可以使用类.成员
的方式调用(调用方式和static成员一致),但是他们在运行时依然是实体的实例成员
class Singleton2 private constructor(){
companion object{
fun get(): Singleton2{
return Inner2.instance
}
}
private object Inner2{
val instance: Singleton2 = Singleton2()
}
}
如上面展示的那样,我们使用伴生对象可以更好的和单例结合,这样在调用单例的时候可以在我们想要获得单例实例的时候再出初始化单例,保证了线程安全
objec,companion和const
刚开始学习kotlin的时候,可能会对companion object{}和const关键字弄混淆,这里我给出一点个人的理解:
- Kotlin用对象表达式和对象声明实现Java匿名内部类这种情况,即匿名类的实现对象为object。
- companion object{}伴生对象,虽然调用的时候类似static,但它依然是对象的实例成员,并且可以实现接口
-const 编译时常量。1.String或基本类型进行初始化;2.没有自定义getter;3对象成员或顶级(Top-level)。从实际上看,它更符合static final的常量
静态变量
如果你硬是要搞成Java中的静态成员和静态方法的话,你可以用:
静态成员:
- @JvmField注解:生成与该属性相同的静态字段
- lateinit关键字:延迟初始化(没用过)
- const()关键字:将 Kotlin 属性转换成 Java 中的静态字段(定义常量用)
静态方法:
- @JvmStatic注解:在单例对象和伴生对象中生成对应的静态方法
class StaticTest{
companion object{
const val s= ""
@JvmStatic fun test() = print(s)
}
}