原创
  • 2020-07-27
  • 浏览 (108)
  • 评论 (0)

Kotlin 单例类、匿名类、顶级声明、常量

在 Java 里面写常量,我们用的是 static + final。而在 Kotlin 里面,除了 final 的写法不一样,static 的写法也不一样,而且是更不一样。确切地说:在 Kotlin 里,静态变量和静态方法这两个概念被去除了。

object 关键字

object 实现单例类

object 的意思很直接:创建一个类,并且创建一个这个类的对象。这个就是 object 的意思:对象。

object Sample {
    val name = "A name"
}
<!--在代码中如果要使用这个对象,直接通过它的类名就可以访问-->
Sample.name

这不就是单例么,所以在 Kotlin 中创建单例不用像 Java 中那么复杂,只需要把 class 换成 object 就可以了。这种通过 object 实现的单例是一个饿汉式的单例(类加载的时候就实例化了),这个对象的成员变量都是private static的,函数是final的,并且实现了线程安全。

object A {
    val number: Int = 1
    fun method() {
        println("A.method()")
    }
}

object 实现匿名类

val listener = object: ViewPager.SimpleOnPageChangeListener() {
    override fun onPageSelected(position: Int) {
        // override
    }
}

和 Java 创建匿名类的方式很相似,只不过把 new 换成了 object:

companion 关键字

用 object 修饰的对象中的变量都是静态的,但有时候,我们只想让类中的一部分函数和变量是静态的该怎么做呢。可以在类中创建一个对象,把需要静态的变量放在内部对象中。

class A {
    var number: Int = 1
        //对象 B 是静态的
    object B {
            // age 是静态的
        var age: Int = 18
            //method 是 final 的
        fun method(){
            print("B.method()")
        }
    }
}

除此之外,类中嵌套的对象可以用 companion 修饰。companion 可以理解为伴随、伴生,表示修饰的对象和外部类绑定。companion object 就是 Java 静态变量的等价写法

class A {
    var number: Int = 1
    companion object {
        var age: Int = 18
        fun method(){
            print("B.method()")
        }
    }
}

顶级声明

Kotlin 允许把属性和函数的声明不写在 class 里面。

package cn.blogss.core.kotlin.topdeclaration

fun topLevelFun() {}

var top: Int = 1

这样写的属性和函数,不属于任何 class,而是直接属于 package,它和静态变量、静态函数一样是 static 的,但用起来更方便,你在其它地方用的时候,就连类名都不用写。

<!--直接 import 变量和函数-->
import cn.blogss.core.kotlin.topdeclaration.top
import cn.blogss.core.kotlin.topdeclaration.topLevelFun

topLevelFun()
top

那在实际使用中,在 object、companion object 和 top-level 中该选择哪一个呢?简单来说按照下面这两个原则判断:

  1. 如果想写工具类的功能,直接创建文件,写 top-level「顶层」函数。
  2. 如果需要继承别的类或者实现接口,就用 object 或 companion object。

常量

  1. Kotlin 的常量必须声明在对象(包括伴生对象)或者「top-level 顶层」中,因为常量是静态的。
  2. Kotlin 新增了修饰常量的 const 关键字
  3. Kotlin 中只有基本类型和 String 类型可以声明成常量
    companion object {
     const val con: Int = 1
    }
    

【参考文献】

  1. Kotlin 里那些「不是那么写的」
正文到此结束
本文目录