對(duì)象聲明就是單例了杨凑。object DataProviderManager
就可以理解為創(chuàng)建了類DataProviderManager
并且實(shí)現(xiàn)了單例模式。
測(cè)試代碼
class test {
object DataProviderManager {
fun registerDataProvider(provider: String) {
// ……
}
val allDataProviders: Collection<String>
get() = listOf("a")
}
fun test() {
DataProviderManager.registerDataProvider("")
}
}
class MyClass {
companion object {
var a: String = ""
fun create(): MyClass = MyClass()
}
fun test() {
MyClass.create()
}
}
class MyClass1 {
companion object {
@JvmStatic
var a: String = ""
@JvmStatic
fun create(): MyClass1 = MyClass1()
}
fun test() {
MyClass1.create()
}
}
查看kotlin最終生成的java代碼
Tools->Kotlin -> Decompile Kotlin to Java
然后點(diǎn)擊上面的Decompile按鈕忌锯,會(huì)得到轉(zhuǎn)化后的java文件礼殊,如下
// MyClass.java
import kotlin.Metadata;
import kotlin.jvm.internal.DefaultConstructorMarker;
import org.jetbrains.annotations.NotNull;
public final class MyClass {
public static final MyClass.Companion Companion = new MyClass.Companion((DefaultConstructorMarker)null);
public final void test() {
Companion.create();
}
public static final class Companion {
@NotNull
public final String getA() {
return MyClass.a;
}
public final void setA(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
MyClass.a = var1;
}
@NotNull
public final MyClass create() {
return new MyClass();
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
// test.java
import java.util.Collection;
import kotlin.Metadata;
import kotlin.collections.CollectionsKt;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
public final class test {
public final void test() {
test.DataProviderManager.INSTANCE.registerDataProvider("");
}
public static final class DataProviderManager {
public static final test.DataProviderManager INSTANCE;
public final void registerDataProvider(@NotNull String provider) {
Intrinsics.checkParameterIsNotNull(provider, "provider");
}
@NotNull
public final Collection getAllDataProviders() {
return (Collection)CollectionsKt.listOf("a");
}
private DataProviderManager() {
INSTANCE = (test.DataProviderManager)this;
}
static {
new test.DataProviderManager();
}
}
}
// MyClass1.java
import kotlin.Metadata;
import kotlin.jvm.JvmStatic;
import kotlin.jvm.internal.DefaultConstructorMarker;
import org.jetbrains.annotations.NotNull;
public final class MyClass1 {
@NotNull
private static String a = "";
public static final MyClass1.Companion Companion = new MyClass1.Companion((DefaultConstructorMarker)null);
public final void test() {
Companion.create();
}
@NotNull
public static final String getA() {
return Companion.getA();
}
public static final void setA(@NotNull String var0) {
Intrinsics.checkParameterIsNotNull(var0, "<set-?>");
Companion.setA(var0);
}
@JvmStatic
@NotNull
public static final MyClass1 create() {
return Companion.create();
}
public static final class Companion {
@JvmStatic
@NotNull
public final MyClass1 create() {
return new MyClass1();
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
- 看生成的
test.java
泌参,里面的DataProviderManager
就是個(gè)單例盖溺。object DataProviderManager
就可以理解為創(chuàng)建了類DataProviderManager
并且實(shí)現(xiàn)了單例模式。
調(diào)用DataProviderManager.registerDataProvider("")
對(duì)應(yīng)的java代碼就是DataProviderManager.INSTANCE.registerDataProvider("")
常見(jiàn)調(diào)用單例類方法代碼
DataProviderManager.getInstance().registerDataProvider("")
,只是獲得instance方式不一樣而已
-
Companion object
就不是單例哮内,就把它當(dāng)做靜態(tài)變量就好了。加了@JvmStatic
之后MyClass1中多了private static String a = "";
和public static final MyClass1 create() {
在 JVM 平臺(tái),如果使用 @JvmStatic 注解,你可以將伴生對(duì)象的成員生成為真正的靜態(tài)方法和字段。
有同學(xué)會(huì)問(wèn)驳棱,我怎么實(shí)現(xiàn)一個(gè)單例類給其他類用呢?
就像上面說(shuō)的一樣,object className
就相當(dāng)于定義了一個(gè)實(shí)現(xiàn)單例模式的類。所以我們?cè)谀硞€(gè)kt文件中寫(xiě)如下代碼
object UserHelper{
var username:String = ""
}
class LoginActivity{
fun doLogin(name:String){
UserHelper.username = name
}
}
我們創(chuàng)建了一個(gè)UserHelper
單例類拆祈,用來(lái)保存登錄用戶的信息老玛;LoginActivity
里面用戶登錄逻炊,讓返回的name
賦值給UserHelper
互亮、
Decompile kotlin to java
public final class LoginActivity {
public final void doLogin(@NotNull String name) {
Intrinsics.checkParameterIsNotNull(name, "name");
UserHelper.INSTANCE.setUsername(name);
}
}
// UserHelper.java
package com.xstudy.assistteacher.module.inclass;
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
public final class UserHelper {
@NotNull
private static String username;
public static final UserHelper INSTANCE;
@NotNull
public final String getUsername() {
return username;
}
public final void setUsername(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
username = var1;
}
private UserHelper() {
INSTANCE = (UserHelper)this;
username = "";
}
static {
new UserHelper();
}
}