Kotlin委託屬性 簡化資料訪問

2021-09-19 22:08:58 字數 3324 閱讀 5347

而且,之前的那一版,只做到了「高效」,沒有做到「易用」。

private static final synckv data =

.executor(asynctask.thread_pool_executor)

.keys(keys.class)

.encoder(new confuseencoder())

.sync();

// keys define

public inte***ce keys

public static synckv data()

public static string getstring(int key)

public static void putstring(int key, string value)

public static byte getarray(int key)

public static void putarray(int key, byte value)

// ......}

if(textutils.isempty(account))

該用法的複雜度在於:

如果想用靜態方法(呼叫時簡單一些),則每乙個資料儲存類都需要實現乙份各種型別的get和set;

如果直接返回data()來讀寫, 寫起來會比較長:

if(textutils.isempty(account))

直到後來了解了kotlin委託, 彷彿看到了曙光……

override fun createinstance(): lightkv

var showcount by int(1)

var account by string(2)

var token by string(3)

var secret by array(4 or datatype.encode)}

if (textutils.isempty(account))

語法: val/var 《屬性名》: 《型別》 by 《表示式》。

class example
by 後面的表示式是對應的委託, 屬性的 get() 和 set() 會被委託給它的 getvalue() 和 setvalue() 方法。

當然,如果宣告的是val, 則不會委託set()方法。

屬性的委託,需要提供乙個 getvalue() 函式和 setvalue() 函式(如果宣告的是var 的話),並以operator修飾。

class delegate ' to me!"

}operator fun setvalue(thisref: any?, property: kproperty<*>, value: string) ' in $thisref.")

}}

例子中,thisref 是 example 的引用, 引數 property 儲存了對屬性p的描述,例如可以通過property.name獲取p的名字.

訪問 p 時,將呼叫 delegate 中的 getvalue() 函式;

給 p 賦值時,將呼叫 setvalue() 函式。

val e = example()

println(e.p)

e.p = "new"

輸出結果:

example@33a17727, thank you for delegating 『p』 to me!

new has been assigned to 『p』 in example@33a17727.

class c
// 由編譯器生成的相應**:

class c

前後對比,不難看出,其實屬性委託的本質是「**模式」的語法封裝。

abstract class kvdata

protected fun boolean(key: int) = kvproperty(key or datatype.boolean)

protected fun int(key: int) = kvproperty(key or datatype.int)

protected fun float(key: int) = kvproperty(key or datatype.float)

protected fun double(key: int) = kvproperty(key or datatype.double)

protected fun long(key: int) = kvproperty(key or datatype.long)

protected fun string(key: int) = kvproperty(key or datatype.string)

protected fun array(key: int) = kvproperty(key or datatype.array)

fun disableautocommit()

fun enableautocommit()

}

該抽象類宣告了lightkv, 新增了自動提交開關,以及定了個各種型別委託。

為方便編寫委託, kotlin標準庫定義了的readwriteproperty介面:

inte***ce readwriteproperty
使用時實現介面的方法即可。

為了統一定義各個型別委託,我們在建構函式傳入key, 由key決定對應的型別操作。

通過thisref.data(lightkv)和 key, 分別在getvalue和setvalue方法中實現取值和賦值。

class kvproperty(private val key: int) : readwriteproperty as t

}override operator fun setvalue(thisref: kvdata, property: kproperty<*>, value: t)

= with(thisref.data)

if(mmode == lightkv.sync_mode && thisref.autocommit)

}}

在lightkv為sync_mode時自動commit()。

當然,如果需要批量提交。可以呼叫disableautocommit()禁用自動提交。

最後,在使用時,繼承kvdata,宣告屬性,即可像訪問變數一樣讀寫lightkv的資料(參見第三節)。

repositories 

dependencies

Kotlin學習 Kotlin委託

委託模式是軟體設計模式中的一項基本技巧。在委託模式中,有兩個物件參與處理同乙個請求,接受請求的物件將請求委託給另乙個物件來處理。kotlin 直接支援委託模式,更加優雅,簡潔。kotlin 通過關鍵字 by 實現委託 類的委託即乙個類中定義的方法實際是呼叫另乙個類的物件的方法來實現的。以下例項中派生...

Kotlin基礎 委託

類委託 屬性委託 2.1.方法一 可以按需繼承readonlyproperty readwriteproperty兩個介面中的乙個 2.2.方法二 自己定義,但方法引數必須和 1 中介面的方法引數一致 標準委託 3.1.延遲屬性 lazy 3.2.可觀察屬性 observable 3.3.把屬性儲存...

Kotlin系列八 委託

委託模式已經證明是實現繼承的乙個很好的替代方式,而 kotlin 可以零樣板 地原生支援它。這是官方對委託的描述,可能比較抽象但當你了解其意義和使用,會發現委託所帶來的方便會讓你愛不釋手,下面我們來開始學習委託吧,首先看乙個官方的例子 inte ce base class baseimpl val ...