Kotlin單例(對(duì)象聲明)

對(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();
      }
   }
}

  1. 看生成的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方式不一樣而已

  1. 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();
   }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市余素,隨后出現(xiàn)的幾起案子豹休,更是在濱河造成了極大的恐慌,老刑警劉巖桨吊,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件威根,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡视乐,警方通過(guò)查閱死者的電腦和手機(jī)洛搀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)佑淀,“玉大人留美,你說(shuō)我怎么就攤上這事∩烊校” “怎么了谎砾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捧颅。 經(jīng)常有香客問(wèn)我景图,道長(zhǎng),這世上最難降的妖魔是什么碉哑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任挚币,我火速辦了婚禮,結(jié)果婚禮上扣典,老公的妹妹穿的比我還像新娘妆毕。我一直安慰自己,他們只是感情好贮尖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布设塔。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闰蛔。 梳的紋絲不亂的頭發(fā)上痕钢,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音序六,去河邊找鬼任连。 笑死,一個(gè)胖子當(dāng)著我的面吹牛例诀,可吹牛的內(nèi)容都是我干的随抠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼繁涂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拱她!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起扔罪,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秉沼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后矿酵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體唬复,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年全肮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敞咧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辜腺,死狀恐怖休建,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情评疗,我是刑警寧澤测砂,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站壤巷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瞧毙。R本人自食惡果不足惜胧华,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宙彪。 院中可真熱鬧矩动,春花似錦、人聲如沸释漆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)男图。三九已至示姿,卻和暖如春甜橱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栈戳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工岂傲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人子檀。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓镊掖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親褂痰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亩进,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容