美文网首页
16. 对象声明与伴生对象

16. 对象声明与伴生对象

作者: 努力生活的西鱼 | 来源:发表于2019-11-27 20:52 被阅读0次
匿名内部类

匿名内部类主要是针对那些获取抽象类或者接口对象而来的。最常见的匿名内部类点击事件:

//java,匿名内部类的写法
btn.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {
         
     }
});

上面这个是Java匿名内部类的写法,Kotlin没有new关键字,那么Kotlin的匿名内部类该怎么写呢?

btn1.setOnClickListener(object : View.OnClickListener{
    override fun onClick(v: View?) {
        print("1111")
    }

})

方法的参数是一个匿名内部类,先写object,然后写你的参数类型View.OnClickListener{}

单例模式
object AAA{
   var a = 10;
   fun getName() : String{
       return "武松";
   }
}

上面这个类AAA,默认就有单例,所以可以直接AAA.getName(),这样调用方法。AAA.a这样直接使用变量,混合模式的时候,我们的调用方式是AAA.INSTANCE.getName()

摘抄:https://www.jianshu.com/p/cdf11084c11b
单例模式在一些场景中很有用,而Kotlin使单例声明变得很容易。

object DataProviderManager {
    fun registerDataProvider(provider: DataProvider) {
        // ……
    }
    val allDataProviders: Collection<DataProvider>
        get() = // ……
}

这称为对象声明。并且它总是在object关键字后跟一个名称。就像声明变量一样,对象声明不是一个表达式,不能用在赋值语句的右边。

对象声明的初始化过程是线程安全的。

如需引用该对象,直接使用其名称即可:

DataProviderManager.registerDataProvider(……)

对象声明不能用在局部作用域,但是它们可以嵌套到其他对象声明或非内部类中。

object
class Driver

interface OnExternalDriverMountListener {

    fun onMount(driver: Driver);

    fun onUnmount(driver: Driver);

}

abstract class Player

object MusicPlayer : Player(), OnExternalDriverMountListener {

    val state: Int = 0;

    fun play(url: String) {

    }

    fun stop() {

    }

    override fun onMount(driver: Driver) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onUnmount(driver: Driver) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

}
  • 只有一个实例的类
  • 不能自定义构造方法
  • 可以实现接口,继承父类
  • 本质上就是单例模式最基本的实现
伴生对象
  • 每个类可以对应一个伴生对象
  • 伴生对象的成员全局独一份
  • 伴生对象的成员类似Java的静态成员
  • 静态成员考虑用包级函数,变量替代
  • JvmStatic和JvmField的使用

类内部的对象声明可以使用companion关键字标记:

class MyClass {

    companion object Factory {
        fun create():MyClass {
            return MyClass();
        }
    }

}

该伴生对象的成员可通过只使用类名作为限定符来调用:

val instance = MyClass.create();

val instance = MyClass.Factory.create();

可以省略伴生对象的名称,在这种情况下将使用名称Companion:

class MyClass {

    companion object {
        ...
    }

}

val x = MyClass.Companion;

其自身所用的类的名称可用作对该类的伴生对象的引用:

class MyClass1 {

    companion object Named {
        
    }

}

val instance = MyClass1;

请注意,即使伴生对象的成员看起来像其他语言的静态成员,在运行时他们仍然是真实对象的实例成员,而且,例如还可以实现接口:

interface Factory<T> {
    fun create(): T
}

class MyClass {
    companion object : Factory<MyClass> {
        override fun create(): MyClass = MyClass()
    }
}

val f: Factory<MyClass> = MyClass
JvmStatic和JvmField的使用
class EventBusUtils {

    companion object {

        @JvmField
        val TAG = "Kotlin";

        @JvmStatic
        fun register(obj: Any): Unit {
            EventBus.getDefault().register(obj);
        }

        fun unregister(obj: Any): Unit {
            EventBus.getDefault().unregister(this);
        }

        fun post(obj: Any): Unit {
            EventBus.getDefault().post(obj);
        }

    }

}

相关文章

  • 16. 对象声明与伴生对象

    匿名内部类 匿名内部类主要是针对那些获取抽象类或者接口对象而来的。最常见的匿名内部类点击事件: 上面这个是Java...

  • scala-08-伴生对象

    基本介绍 1)Scala中伴生对象采用object关键字声明,伴生对象中声明的全是 "静态"内容,可以通过伴生对象...

  • 对象声明(单例)

    对象声明 object 对象声明的初始化过程是线程安全的.直接调用 可以有超类型 伴生对象类内部声明可用 comp...

  • Kotlin原理-object关键字

    object关键字有下面的三种用法: 对象声明 伴生对象 对象表达式 我们逐一来看看它们的实现原理 对象声明 ob...

  • Kotlin:object关键字总结

    object关键字主要有三种使用场景对象声明(object declaration)伴生对象(companion ...

  • Day08对象和伴生对象

    1、对象声明2、伴生对象3、@JvmField 和 @JvmStatic 的使用4、const 关键字5、obje...

  • Kotlin : object、companion object

    object关键字主要有三种使用场景 对象声明(object declaration) 伴生对象(companio...

  • Kotlin面向对象 (8)✔️强大的object关键字

    对象表达式对象声明 (单例,隶属于——饿汉模式)伴生对象 object 关键字主要在声明一个类的同时创建这个类的对...

  • Scala提取器基础

    apply方法 伴生类和伴生对象的概念,companion class和companion object伴生对象里...

  • 伴生对象

网友评论

      本文标题:16. 对象声明与伴生对象

      本文链接:https://www.haomeiwen.com/subject/yxpmwctx.html