Kotlin中companion饰豺、object亿鲜、擴(kuò)展函數(shù)、頂層函數(shù)的最佳使用

記錄一下初學(xué)kotlin時(shí)的一些疑惑冤吨。
當(dāng)我們需要添加屬于類的常量或者方法時(shí)蒿柳,通常我們需要在java中使用static關(guān)鍵字,而kotlin中去掉了static并且沒有提供對應(yīng)得關(guān)鍵字漩蟆,那我們該如何在kotlin中實(shí)現(xiàn)呢垒探?

  • companion伴生對象
  • object class
  • 擴(kuò)展函數(shù)
  • 頂層方法和屬性等

實(shí)現(xiàn)的方式多種多樣,各自的使用場景是什么呢怠李?其實(shí)只要將相關(guān)的代碼和“翻譯”成對應(yīng)得java代碼或者看一下在java中如何調(diào)用對應(yīng)得kotlin屬性或者方法圾叼,就可以很清楚的看出來其使用場景了。

1. companion伴生對象

//kotlin實(shí)現(xiàn)代碼
class CompanionTest {
    companion object {
        const val TAG = "this is a static message"
        fun testFunction() {}
    }
}
//對應(yīng)的java代碼
public final class CompanionTest {
   @NotNull
   public static final String TAG = "this is a static message";
   public static final Test.Companion Companion = new Test.Companion((DefaultConstructorMarker)null);

   public static final class Companion {
      public final void testFunction() {
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

可以看到在Java中companion其實(shí)是一個(gè)名為Companion的靜態(tài)內(nèi)部類捺癞,并且在外部類中生成一個(gè)該內(nèi)部類的實(shí)例夷蚊。在java中調(diào)用則用如下方式:

String test = Test.TAG;
CompanionTest.Companion.testFunction();

2. object關(guān)鍵字

//kotlin中的object實(shí)現(xiàn)
object ObjectTest {
    const val TAG = "this is a static message"
    fun testFunction() {}
}
//對應(yīng)的java代碼
public final class ObjectTest {
   @NotNull
   public static final String TAG = "this is a static message";
   public static final ObjectTest INSTANCE;

   public final void testFunction() {
   }

   static {
      ObjectTest var0 = new ObjectTest();
      INSTANCE = var0;
   }
}

可以看到object的實(shí)現(xiàn)和java中的餓漢式單例是一致的,在類加載的時(shí)候即生成一個(gè)該類的實(shí)例翘簇。companion則是在類加載的時(shí)候?qū)崿F(xiàn)一個(gè)靜態(tài)內(nèi)部類的實(shí)例撬码,嚴(yán)格來說這兩種實(shí)現(xiàn)方法并不是java中的靜態(tài)方法。

String objectStr = ObjectTest.TAG;
ObjectTest.INSTANCE.testFunction();

3. 擴(kuò)展函數(shù)

//kotlin中的擴(kuò)展函數(shù)
fun String?.testFunction() {}
//對應(yīng)的java代碼
public final class ExtendTestKt {
   public static final void testFunction(@Nullable String $receiver) {
   }
}

擴(kuò)展方法和我們java中常用的static方法是比較相似的版保,只是會(huì)將調(diào)用的對象作為方法的參數(shù)呜笑。另外如果kotlin file會(huì)生成對應(yīng)得kotlinFileNameKT的class夫否,如果不想使用默認(rèn)的名字可以在kotlin中使用 @file:JvmName("StringUtil") 注解指定生成的類名。

//使用上面的注解后在java中調(diào)用該擴(kuò)展方法
StringUtil.testFunction("");

4.頂層函數(shù)和頂層屬性

//kotlin頂層函數(shù)和屬性
const val CONSTANT_STRING = "test string"
val VAL_STRING = "test string"
fun testFunction() {}
//對應(yīng)的java代碼
public final class TopTestKt {
   @NotNull
   public static final String CONSTANT_STRING = "test string";
   @NotNull
   private static final String VAL_STRING = "test string";

   @NotNull
   public static final String getVAL_STRING() {
      return VAL_STRING;
   }

   public static final void testFunction() {
   }
}

頂層函數(shù)的使用和java中類方法的定義是一模一樣的叫胁。

TopTestKt.getVAL_STRING();
String topStr = TopTestKt.CONSTANT_STRING;
TopTestKt.testFunction();

這里插入一個(gè)const的分析凰慈,可以看到加了const關(guān)鍵字會(huì)被編譯成public static final的常量,而不加的話則是private static final并且生成一個(gè)get方法供外部使用驼鹅。
另外const val必須是編譯時(shí)常量微谓,而val則沒有這個(gè)要求,如下圖


Screen Shot 2019-02-19 at 16.27.21.png

總結(jié)

對于常量的聲明输钩,幾種方法最后的效果都是一致的豺型。加上const更加符合java通常的寫法,并且可以減少不必要的方法买乃。
對于方法姻氨,如果想達(dá)到j(luò)ava中static function的效果,使用擴(kuò)展函數(shù)或者頂層函數(shù)更好剪验。使用companion會(huì)額外的生成內(nèi)部類對象肴焊,只有在確定需要使用單例時(shí)才使用object去實(shí)現(xiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末功戚,一起剝皮案震驚了整個(gè)濱河市娶眷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啸臀,老刑警劉巖届宠,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壳咕,居然都是意外死亡席揽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門谓厘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寸谜,你說我怎么就攤上這事竟稳。” “怎么了熊痴?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵他爸,是天一觀的道長。 經(jīng)常有香客問我果善,道長诊笤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任巾陕,我火速辦了婚禮讨跟,結(jié)果婚禮上纪他,老公的妹妹穿的比我還像新娘。我一直安慰自己晾匠,他們只是感情好茶袒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凉馆,像睡著了一般薪寓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澜共,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天向叉,我揣著相機(jī)與錄音,去河邊找鬼嗦董。 笑死植康,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的展懈。 我是一名探鬼主播销睁,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼存崖!你這毒婦竟也來了冻记?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤来惧,失蹤者是張志新(化名)和其女友劉穎冗栗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體供搀,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隅居,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葛虐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胎源。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屿脐,靈堂內(nèi)的尸體忽然破棺而出涕蚤,到底是詐尸還是另有隱情,我是刑警寧澤的诵,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布万栅,位于F島的核電站,受9級(jí)特大地震影響西疤,放射性物質(zhì)發(fā)生泄漏烦粒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一代赁、第九天 我趴在偏房一處隱蔽的房頂上張望扰她。 院中可真熱鬧兽掰,春花似錦、人聲如沸义黎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廉涕。三九已至泻云,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狐蜕,已是汗流浹背宠纯。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留层释,地道東北人婆瓜。 一個(gè)月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像贡羔,于是被迫代替她去往敵國和親廉白。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

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