kotlin的屬性與字段

屬性與字段

在kotlin中聲明屬性可以用var,val聲明,其中var聲明的是一個(gè)可變的變量,val聲明是只讀的,不可修改

image

在IDE中,給val聲明的屬性賦值會(huì)報(bào)錯(cuò)

屬性的get和set方法

在kotlin中其實(shí)也是有g(shù)et和set方法的,不過(guò)一般都是默認(rèn)實(shí)現(xiàn)的,這個(gè)比java方便

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]

其初始器(initializer)、getter 和 setter 都是可選的。屬性類(lèi)型如果可以從初始器 (或者從其 getter 返回值橙弱,如下文所示)中推斷出來(lái),也可以省略翅雏。

var allByDefault: Int? // 錯(cuò)誤:需要顯式初始化器,隱含默認(rèn) getter 和 setter
這種展示是不可以的,必須要在`init`中初始化才可以
var initialized = 1 // 類(lèi)型 Int人芽、默認(rèn) getter 和 setter

這個(gè)的意思就是一個(gè)屬性必須要有已經(jīng)初始化之后才會(huì)有默認(rèn)的get和set方法,如果沒(méi)有初始化,IDE就會(huì)報(bào)錯(cuò)

get和set的多種實(shí)現(xiàn)


    var ag1: Int = 0
    
        get() {
            return field
        }
        set(value) {
            field = value
        }

幕后字段

// 錯(cuò)誤的示范
class NetworkConfig(override var i: Int = 0) : Base() {

    init {
        ag = 0
    }

    var ag1: Int = 0

        get() {
            return ag1
        }
        set(value) {
            ag1 = value
        }

    fun ss() {
//        ag = 99
    }
}

在這里我們好似是把get和set的值賦值到了屬性上望几,但是如果我們這樣寫(xiě)就會(huì)陷入死循環(huán),我們?cè)趕et方法里給屬性賦值萤厅,在kotlin里就會(huì)再次調(diào)用屬性的set方法橄抹,陷入循環(huán),

// 錯(cuò)誤的示范
class NetworkConfig(override var i: Int = 0) : Base() {

    init {
        ag = 0
    }

    var ag1: Int = 0

        get() {
            return ag1(再次調(diào)用get方法)
        }
        set(value) {
            ag1 = value(再次調(diào)用說(shuō)set方法)
        }

    fun ss() {
//        ag = 99
    }
}

在 Kotlin 類(lèi)中不能直接聲明字段惕味。然而楼誓,當(dāng)一個(gè)屬性需要一個(gè)幕后字段時(shí),Kotlin 會(huì)自動(dòng)提供名挥。這個(gè)幕后字段可以使用field標(biāo)識(shí)符在訪(fǎng)問(wèn)器中引用:

幕后屬性

如果你的需求不符合這套“隱式的幕后字段”方案疟羹,那么總可以使用 幕后屬性(backing property):

private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
    get() {
        if (_table == null) {
            _table = HashMap() // 類(lèi)型參數(shù)已推斷出
        }
        return _table ?: throw AssertionError("Set to null by another thread")
    }

編譯期常量

如果只讀屬性的值在編譯期是已知的,那么可以使用 const 修飾符將其標(biāo)記為編譯期常量禀倔。 這種屬性需要滿(mǎn)足以下要求:

位于頂層或者是 object 聲明 或 companion object 的一個(gè)成員
以 String 或原生類(lèi)型值初始化
沒(méi)有自定義 getter
這些屬性可以用在注解中:

const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
//作用和final相似,要不就是在一個(gè)類(lèi)的頂層,要不就是靜態(tài)屬性
@Deprecated(SUBSYSTEM_DEPRECATED) fun foo() { …… }

延遲初始化屬性與變量

一般地榄融,屬性聲明為非空類(lèi)型必須在構(gòu)造函數(shù)中初始化。 然而救湖,這經(jīng)常不方便愧杯。例如:屬性可以通過(guò)依賴(lài)注入來(lái)初始化, 或者在單元測(cè)試的 setup 方法中初始化鞋既。 這種情況下民效,你不能在構(gòu)造函數(shù)內(nèi)提供一個(gè)非空初始器。 但你仍然想在類(lèi)體中引用該屬性時(shí)避免空檢測(cè)涛救。

為處理這種情況畏邢,你可以用 lateinit 修飾符標(biāo)記該屬性:

public class MyTest {
    lateinit var subject: TestSubject

    @SetUp fun setup() {
        subject = TestSubject()
    }

    @Test fun test() {
        subject.method()  // 直接解引用
    }
}

該修飾符只能用于在類(lèi)體中的屬性(不是在主構(gòu)造函數(shù)中聲明的 var 屬性,并且僅當(dāng)該屬性沒(méi)有自定義 getter 或 setter 時(shí))检吆,而自 Kotlin 1.2 起舒萎,也用于頂層屬性與局部變量。該屬性或變量必須為非空類(lèi)型蹭沛,并且不能是原生類(lèi)型臂寝。

在初始化前訪(fǎng)問(wèn)一個(gè) lateinit 屬性會(huì)拋出一個(gè)特定異常,該異常明確標(biāo)識(shí)該屬性被訪(fǎng)問(wèn)及它沒(méi)有初始化的事實(shí)摊灭。

所以我們?cè)谛枰臅r(shí)候可以檢測(cè)這個(gè)屬性是否初始化

if (foo::bar.isInitialized) {
    println(foo.bar)
}

此檢測(cè)僅對(duì)可詞法級(jí)訪(fǎng)問(wèn)的屬性可用咆贬,即聲明位于同一個(gè)類(lèi)型內(nèi)、位于其中一個(gè)外圍類(lèi)型中或者位于相同文件的頂層的屬性帚呼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掏缎,一起剝皮案震驚了整個(gè)濱河市皱蹦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眷蜈,老刑警劉巖沪哺,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異酌儒,居然都是意外死亡辜妓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)忌怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)籍滴,“玉大人,你說(shuō)我怎么就攤上這事榴啸∫熘穑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵插掂,是天一觀(guān)的道長(zhǎng)灰瞻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辅甥,這世上最難降的妖魔是什么酝润? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮璃弄,結(jié)果婚禮上要销,老公的妹妹穿的比我還像新娘。我一直安慰自己夏块,他們只是感情好疏咐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著脐供,像睡著了一般浑塞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上政己,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天酌壕,我揣著相機(jī)與錄音,去河邊找鬼歇由。 笑死卵牍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沦泌。 我是一名探鬼主播糊昙,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谢谦!你這毒婦竟也來(lái)了释牺?” 一聲冷哼從身側(cè)響起萝衩,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎船侧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體厅各,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镜撩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了队塘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袁梗。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖憔古,靈堂內(nèi)的尸體忽然破棺而出遮怜,到底是詐尸還是另有隱情,我是刑警寧澤鸿市,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布锯梁,位于F島的核電站,受9級(jí)特大地震影響焰情,放射性物質(zhì)發(fā)生泄漏陌凳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一内舟、第九天 我趴在偏房一處隱蔽的房頂上張望合敦。 院中可真熱鬧,春花似錦验游、人聲如沸充岛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)崔梗。三九已至,卻和暖如春垒在,著一層夾襖步出監(jiān)牢的瞬間炒俱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工爪膊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留权悟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓推盛,卻偏偏與公主長(zhǎng)得像峦阁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耘成,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 一:聲明屬性 kotlin類(lèi)中屬性可以使用關(guān)鍵字var也可以使用val,使用一個(gè)屬性只需要在類(lèi)實(shí)例后引用即可 二:...
    覆水無(wú)言閱讀 529評(píng)論 0 0
  • 聲明屬性 Kotlin 類(lèi)中的屬性既可以用關(guān)鍵字 var 聲明為可變的榔昔,也可以用關(guān)鍵字 val 聲明為只讀的驹闰。 使...
    WotYang閱讀 3,264評(píng)論 0 0
  • 1、聲明屬性 Kotlin 類(lèi)中的屬性既可以用關(guān)鍵字 var聲明為可變的撒会,也可以用關(guān)鍵字 val聲明為只讀的嘹朗。 要...
    愛(ài)學(xué)習(xí)的蹭蹭閱讀 629評(píng)論 0 1
  • 借鑒kotlin中文站 聲明屬性 Kotlin類(lèi)中聲明屬性,即可用關(guān)鍵字var聲明成可變的诵肛,又可以用關(guān)鍵字val聲...
    簡(jiǎn)書(shū)_大叔閱讀 402評(píng)論 0 0
  • 久違的晴天屹培,家長(zhǎng)會(huì)。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí)怔檩,離放學(xué)已經(jīng)沒(méi)多少時(shí)間了褪秀。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,522評(píng)論 16 22