驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
Kotlin系列:object的4类用法汇总
/  

Kotlin系列:object的4类用法汇总

开篇

这里将kotlin中的object关键字用法总结下

  • 单例对象
  • 静态方法
  • 静态内部类
  • 匿名对象

用法案例

单例对象

//仅仅是单例而已
//kotlin中写法直接是 类名,不需要加括号
object ObjectDeep {
    fun sayHi(): String = "hi"

    val TAG="CDMAN"
}

在使用的使用

fun main() {
    /**********第一例测试**********/
    ObjectDeep.sayHi().also(::println)
    //true
    println(ObjectDeep == ObjectDeep)
    println(ObjectDeep.TAG)   
}

请注意几个细节

  • ObjectDeep是没有.出方法的,ObjectDeep后面是没有括号的。【这个写法NB,后面讲】
  • 这样写其实是单例的写法,而且是饿汉单例【不懂百度】

静态方法

Java中,我们会写很多工具类,通常工具类的方法都是静态的,但是在kotlin中是没有静态方法的,但是可以通过如下方式实现

class SomeUtil {
	
    private constructor()

    companion object {
        @JvmStatic
        fun sayHello() = "hello"
      
        @JvmStatic
        fun plus(): Int = 1
    }
}

在kotlin中使用办法如下:

fun main() {
    SomeUtil.plus().also { println(it) }
    SomeUtil.sayHello().also { println(it) }
}

解读如下

  • private constructor()保证了外部无法new
  • @JvmStaic是方便Java调用的时候,不用写Companion,因为假如没有这个注解在Java中调用的时候,需要用如下写法:SomeUtil.Companion.sayHello()

静态内部类

当需要静态的内部类的时候,就可以通过如下写法了

class StaticClass {

    fun outer() = "outer hello"

    object InnerObject {
        fun sayHello() = "hello"
    }
}

使用的时候如下

fun main() {   
 		//调用的是静态内部类的方法
		StaticClass.InnerObject.sayHello()
  	//调用的实例方法
    StaticClass().outer().also { println(it) }
}

匿名对象

类似Javanew一个接口或者抽象类,代码如下

interface ICall {
    fun call(): String
}
fun main() {
      val obj = object : ICall {
        override fun call(): String {
            return "call ICall"
        }
    	}
    println(obj.call())
}

object 表示了后面的是一个匿名对象

结语

这大概就是几个常用的用法了吧?太晚了,写的不够详细,看官有兴趣,结合其他博文和官方文档,一起领取。

积土成山,风雨兴焉。积水成渊,蛟龙生焉。