object關(guān)鍵字有下面的三種用法:
- 對(duì)象聲明
- 伴生對(duì)象
- 對(duì)象表達(dá)式
我們逐一來(lái)看看它們的實(shí)現(xiàn)原理
對(duì)象聲明
object類可以看成是java里面的單例模式在kotlin的便捷實(shí)現(xiàn):
object TestObject {
const val TAG = "TestObject"
fun foo() {
}
}
// kotlin 中調(diào)用
TestObject.foo()
// java 中調(diào)用
TestObject.INSTANCE.foo();
從java的用法里面能看出來(lái),對(duì)象聲明的原理實(shí)際上是將其轉(zhuǎn)換成了java的單例模式:
public final class TestObject {
@NotNull
public static final String TAG = "TestObject";
@NotNull
public static final TestObject INSTANCE;
public final void foo() {
}
private TestObject() {
}
static {
TestObject var0 = new TestObject();
INSTANCE = var0;
}
}
如果與java混用的時(shí)候仆抵,需要使用INSTANCE獲取單例比較麻煩,可以使用@JvmStatic注解將方法修飾成靜態(tài)方法:
object TestObject {
@JvmStatic
fun foo() {
}
}
轉(zhuǎn)換出來(lái)的java類就會(huì)把foo()定義為靜態(tài)方法:
public final class TestObject {
@NotNull
public static final TestObject INSTANCE;
// 這里是靜態(tài)方法
@JvmStatic
public static final void foo() {
}
private TestObject() {
}
static {
TestObject var0 = new TestObject();
INSTANCE = var0;
}
}
伴生對(duì)象
Kotlin中并沒(méi)有靜態(tài)成員的概念,但是我們可以使用伴生對(duì)象達(dá)到類似的效果:
class TestClass {
companion object {
var data = 123
fun foo() {}
}
}
// kotlin 中調(diào)用
TestClass.foo()
// java 中調(diào)用
TestClass.Companion.foo();
同樣可以在java調(diào)用中看出來(lái)它實(shí)際是生成了TestClass的Companion靜態(tài)內(nèi)部類:
public final class TestClass {
private static int data = 123;
@NotNull
public static final TestClass.Companion Companion = new TestClass.Companion((DefaultConstructorMarker)null);
...
public static final class Companion {
public final void foo() {
}
private Companion() {
}
public final int getData() {
return TestClass.data;
}
public final void setData(int var1) {
TestClass.data = var1;
}
...
}
}
同樣在java調(diào)用的時(shí)候需要引用Companion靜態(tài)成員變量,我們可以用@JvmField和@JvmStatic去簡(jiǎn)化:
class TestClass {
companion object {
@JvmField
var data = 123
@JvmStatic
fun foo() {}
}
}
上面kotlin代碼轉(zhuǎn)換的java代碼如下:
public final class TestClass {
public static int data = 123;
public static final TestClass.Companion Companion = new TestClass.Companion((DefaultConstructorMarker)null);
public static final void foo() {
Companion.foo();
}
public static final class Companion {
@JvmStatic
public final void foo() {
}
private Companion() {
}
...
}
}
對(duì)象表達(dá)式
對(duì)象表達(dá)式實(shí)際上就是java的匿名內(nèi)部類:
var listener = object : View.OnClickListener {
override fun onClick(p0: View?) {
}
}
它轉(zhuǎn)換成的java代碼如下:
OnClickListener var10000 = new OnClickListener() {
public void onClick(@Nullable View p0) {
}
};