溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kotlin內(nèi)聯(lián)類與類型別名的使用方法

發(fā)布時(shí)間:2021-06-24 09:31:26 來源:億速云 閱讀:287 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“Kotlin內(nèi)聯(lián)類與類型別名的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Kotlin內(nèi)聯(lián)類與類型別名的使用方法”吧!

內(nèi)聯(lián)類(Inline Class)

內(nèi)聯(lián)類的支持版本目前是1.3及以上。

內(nèi)聯(lián)類的使用其實(shí)很簡單,只需要我們在class前面加上一個(gè)inline關(guān)鍵字即可,如下面這樣:

inline class WoMan(private val name: String) {val length: Intget() =name.length    fun greet() {println("Hello, $name")
    }
}

跟普通的類看上去沒什么區(qū)別,不過我們show bytecode之后看看代碼是怎么樣的

public static final int getLength_impl/* $FF was: getLength-impl*/(String $this) {   return $this.length();}
public static final void greet_impl/* $FF was: greet-impl*/(String $this) {
   String var1 = "Hello, " + $this;   boolean var2 = false;   System.out.println(var1);}
String name = WoMan.constructor-impl("唐三");WoMan.greet-impl(name);

其實(shí)最后都變成了靜態(tài)方法調(diào)用了,那如果我們不用inline關(guān)鍵字修飾的話會(huì)是怎么樣呢

public final class WoMan {   private final String name;   public final int getLength() {      return this.name.length();   }   public final void greet() {
      String var1 = "Hello, " + this.name;      boolean var2 = false;      System.out.println(var1);   }   public WoMan(@NotNull String name) {
      Intrinsics.checkNotNullParameter(name, "name");      super();      this.name = name;   }
}

其實(shí)就是簡單的Java類而已,調(diào)用的話我們還是得對象方法才可以。

WoMan name = new WoMan("唐三");name.greet();

然后我們再說一下內(nèi)聯(lián)函數(shù)的使用要求:內(nèi)聯(lián)類必須含有唯?的?個(gè)屬性在主構(gòu)造函數(shù)中初始化。在運(yùn)?時(shí),將使?這個(gè)唯?屬性來表?內(nèi)聯(lián)類的實(shí)例。

其實(shí)就是起到了包裝器的作用,我們發(fā)現(xiàn)使用的時(shí)候跟普通的類的使用方法一樣,沒有任何區(qū)別,但是我們在性能上就已經(jīng)做得很好了,我們在實(shí)例化一個(gè)對象的時(shí)候,就會(huì)把對象存儲(chǔ)到JVM堆上,我們在存儲(chǔ)和使用對象實(shí)例時(shí)會(huì)有性能損失 - 堆分配和內(nèi)存提取的性能代價(jià)很高。雖然看起來每個(gè)對象性能開銷微不足道,但是累積起來,它對代碼運(yùn)行速度產(chǎn)生嚴(yán)重的影響。如果我們能夠在不受性能影響的情況下獲得強(qiáng)類型系統(tǒng)的所有好處,那不是很好嗎?實(shí)際上,Kotlin新特性inline class就是為了解決這樣的問題而設(shè)計(jì)的。

這樣我們即在性能方面做了節(jié)省,還不影響我們獲得強(qiáng)類型的使用的所有的好處,這樣何樂不為呢?

上面的例子當(dāng)中我們聲明的內(nèi)聯(lián)類對象的時(shí)候其實(shí)就相當(dāng)于聲明了我們內(nèi)聯(lián)類里面包裝的變量而已,從而避免了對象的創(chuàng)建和銷毀。

內(nèi)聯(lián)類的限制

內(nèi)聯(lián)類的柱構(gòu)造函數(shù)里面只能有一個(gè)參數(shù)并且是只能是可讀的,但是呢,它的內(nèi)部是可以擁有成員屬性的,只要它們僅基于構(gòu)造器中那個(gè)基礎(chǔ)值計(jì)算,或者從可以靜態(tài)解析的某個(gè)值或?qū)ο笥?jì)算 - 來自單例,頂級對象,常量等??梢詫?shù)設(shè)置為私有的,但是構(gòu)造函數(shù)必須是共有的,我們的內(nèi)聯(lián)類可以繼承接口,但是不能繼承類,也不能被任何類繼承,不能作為內(nèi)部類實(shí)現(xiàn),也不支持內(nèi)聯(lián)枚舉類。

類型別名

typealias類型別名的時(shí)候跟內(nèi)聯(lián)類有一些相似之處,也容易混淆。

因?yàn)樗鼈兌及A(chǔ)類型,所以內(nèi)聯(lián)類很容易與類型別名混淆。但是有一些關(guān)鍵的差異使它們在不同的場景下得以應(yīng)用。

比如我們需要定義一個(gè)變量,可能是用戶名稱或者用戶密碼等,那么類型肯定是字符串嘛,作為函數(shù)形參的聲明的時(shí)候我們一般都是name:String即可,可是我們想表達(dá)的更清楚一些呢,就可以用類型別名還使用我們自己定義的名字。

typealias userName = String
class WoMan(private val name: userName) {}

可以看到使用起來跟String沒什么區(qū)別,只是表達(dá)的更清楚了。

內(nèi)聯(lián)函數(shù)一方面來說使用的時(shí)候我們需要進(jìn)行拆箱的操作,而類型別名就不需要了,可是類型別名在同一類型的時(shí)候是無法區(qū)分,比如我們同事聲明了兩個(gè)類型別名username,password而且都是字符串,可是我們的定義函數(shù)方法里面需要的參數(shù)是可以改變順序的,因?yàn)槲覀兊膮?shù)類型雖然是不同的類型別名,但是都是一個(gè)String類型的,所以這一點(diǎn)內(nèi)聯(lián)函數(shù)是完全可以不用考慮的,因?yàn)閮?nèi)聯(lián)函數(shù)就是一個(gè)基本類型的包裝體,不同的包裝體肯定不一樣,所以我們的順序是不能改變的。

typealias userName = Stringtypealias passWord = Stringfun test(name: userName, pwd: passWord) {
    
}

上面就很容易看到了,當(dāng)我們name和pwd的傳參數(shù)順序不一樣的時(shí)候,編譯器是無法做出檢測的,運(yùn)行期也不會(huì)報(bào)錯(cuò)的。

但是內(nèi)聯(lián)函數(shù)就是包裝之后就是不同的類。

inline class Username(val name: String)inline class Password(val pwd: String)fun test2(name: Username, pwd: Password) {

}

當(dāng)我們調(diào)用函數(shù)的時(shí)候傳遞的參數(shù)順序改變的話,編譯器是會(huì)報(bào)錯(cuò)的。

所以使用起來各取所需吧,各有各的使用場景。

到此,相信大家對“Kotlin內(nèi)聯(lián)類與類型別名的使用方法”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI