object关键字原理探究

QuibblerQuibbler 2023-11-27 约 5 分钟 1422 次阅读

object关键字原理探究

object关键字有下面的三种用法:

  1. 对象声明
  2. 伴生对象
  3. 对象表达式

1、对象声明

object类可以看成是Java里面的单例模式在Kotlin的便捷实现:

object Binder {
        fun bind() {}
    }

从编译的.class文件可以看出来,对象声明的原理实际上是将其转换成了Java的单例模式(饿汉模式):

public final class Binder {
        @NotNull
        public static final Binder INSTANCE = new Binder();
    }

2、伴生对象

Kotlin中并没有静态成员的概念,但是我们可以使用伴生对象达到类似的效果:

class Binder {
        companion object{
	    fun bind() {}
        }
    }

同样,从编译的.class文件可以看出来实际是生成了Companion静态内部类:

public final class Binder {
      @NotNull
      public static final Companion Companion = new Companion(null);
  
      @Metadata(mv = {1, 8, 0}, k = 1, xi = 48, d1 = {"", "()V", "bind", "", "app_debug"})
      public static final class Companion {
        private Companion() {}
    
        public final void bind() {}
      }
    }

可以用@JvmField和@JvmStatic去简化在Java中的调用:

class Binder {
        companion object{
            @JvmStatic
	    fun bind() {}
        }
    }

此时生成的代码等价为:

public final class Binder {
      @NotNull
      public static final Companion Companion = new Companion(null);
  
      @JvmStatic
      public static final void bind() {
        Companion.bind();
      }
  
      @Metadata("bind", "", "app_debug"})
      public static final class Companion {
        private Companion() {}
    
        @JvmStatic
        public final void bind() {}
      }
    }

3、对象表达式

对象表达式实际上就是生成对应的Java静态类,构造新的实例:

var listener = object : View.OnClickListener {
        override fun onClick(p0: View?) {
        }
    }

转换成等价的Java代码如下:

@NotNull
    private static View.OnClickListener listener = new BinderKt$listener$1();
  
    public static final class BinderKt$listener$1 implements View.OnClickListener {
        public void onClick(@Nullable View p0) {}
    }

旧版Kotlin是生成Java匿名内部类,现在已经有所优化。

相关推荐

Parcelize:Parcelable 实现生成器
Kotlin

Parcelize:Parcelable 实现生成器

Parcelize:Parcelable 实现生成器Parcelable是安卓开发中常用的序列化方式,之前分享过一个Parcelable序列化插件,方便开发者快速生成代码,提高开发效率。1、Parcelize插件Kotlin官方也推出一个Parcelable自动生成的Gradle插件:Parcelize。1.1、引入插件在项目的build.gradle中添加:id("kotlin-parceliz

2.6k
Kotlin的继承
Kotlin

Kotlin的继承

Kotlin的继承1、超类:Any类似于Java中的Object类,Kotlin也有一个叫Any的超类,是所有类的父类,所有类都默认继承自该类。超类的定义如下,其中定义了三个函数:2、open注意上面的Any类用open修饰,表示该类可以被继承。Kotlin中的类默认都是final的,无法被继承:如果想让类可以被继承,就需要用在定义类的地方用open关键字标识该类可以被继承。3、构造器继承中涉及到

2.1k
 Kotlin基本语法
Kotlin

Kotlin基本语法

Kotlin基本语法了解Kotlin语言的基本语法。1、包kotlin文件以.kt结尾,编译文件还是如此只不过在文件名后面加上Kt后缀。这一点和Java不同,Java源文件.java,编译后为.class文件。1.1、包定义每个kotlin文件的第一行就用关键字package定义该文件所在的包。例:1.2、导包用到其它kotlin文件需要使用关键字import导入,这一点和Java一样。kotli

2.1k