object关键字原理探究
object关键字有下面的三种用法:
- 对象声明
- 伴生对象
- 对象表达式
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匿名内部类,现在已经有所优化。

