Kotlin委托屬性(1)
2024-01-06 09:40 ttylinux 閱讀(250) 評論(0) 收藏 舉報(bào)在Kotlin中,委托屬性(Delegated Properties)是一種強(qiáng)大的語言特性,允許你將屬性的 getter 和 setter 方法的實(shí)現(xiàn)委托給其他對象。這使得你能夠通過委托來重用代碼、將屬性的行為解耦,并實(shí)現(xiàn)一些通用的模式。下面是一些關(guān)鍵概念和用法:
class Example { var property: String by Delegate() } class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { // 獲取屬性值的實(shí)際實(shí)現(xiàn) return "Delegated value" } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { // 設(shè)置屬性值的實(shí)際實(shí)現(xiàn) println("Setting value to: $value") } }
在上面的代碼中,Example類中的property屬性的訪問,比如,訪問example.property,就會委托到Delegate.getValue; 屬性值的設(shè)置example.property = "str",就會委托到
Delegae.setValue。
實(shí)際例子:
fun saveCookie(url: String?, domain: String?, cookies: String) { url ?: return var spUrl: String by Preference(url, cookies) @Suppress("UNUSED_VALUE") spUrl = cookies domain ?: return var spDomain: String by Preference(domain, cookies) @Suppress("UNUSED_VALUE") spDomain = cookies }
var spUrl: String by Preference(url, cookies),定義一個(gè)委托屬性spUrl,Preference委托,執(zhí)行spUrl = cookies,會將這個(gè)setValue的動作委托到Preference類中的setValue。
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { putSharedPreferences(name, value) }
其中value的值是cookies.如果要訪問spUrl,那么,對應(yīng)的getValue方法,會被委托到Preference中的getValue方法中去。
總結(jié)來說:
委托屬性,就是將一個(gè)屬性的getValue方法和setValue方法委托到另外一個(gè)代理類來實(shí)現(xiàn)。將屬性的獲取和設(shè)置隔離開來。
class Preference<T>(val name: String, private val default: T) { companion object { private val file_name = "wan_android_file" private val prefs: SharedPreferences by lazy { App.context.getSharedPreferences(file_name, Context.MODE_PRIVATE) } /** * 刪除全部數(shù)據(jù) */ fun clearPreference() { prefs.edit().clear().apply() } /** * 根據(jù)key刪除存儲數(shù)據(jù) */ fun clearPreference(key: String) { prefs.edit().remove(key).apply() } /** * 查詢某個(gè)key是否已經(jīng)存在 * * @param key * @return */ fun contains(key: String): Boolean { return prefs.contains(key) } /** * 返回所有的鍵值對 * * @param context * @return */ fun getAll(): Map<String, *> { return prefs.all } } operator fun getValue(thisRef: Any?, property: KProperty<*>): T { return getSharedPreferences(name, default) } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { putSharedPreferences(name, value) } @SuppressLint("CommitPrefEdits") private fun putSharedPreferences(name: String, value: T) = with(prefs.edit()) { when (value) { is Long -> putLong(name, value) is String -> putString(name, value) is Int -> putInt(name, value) is Boolean -> putBoolean(name, value) is Float -> putFloat(name, value) else -> putString(name, serialize(value)) }.apply() } @Suppress("UNCHECKED_CAST") private fun getSharedPreferences(name: String, default: T): T = with(prefs) { val res: Any = when (default) { is Long -> getLong(name, default) is String -> getString(name, default) ?: "" is Int -> getInt(name, default) is Boolean -> getBoolean(name, default) is Float -> getFloat(name, default) else -> deSerialization(getString(name, serialize(default)) ?: "") } return res as T } /** * 序列化對象 * @param person * * * @return * * * @throws IOException */ @Throws(IOException::class) private fun <A> serialize(obj: A): String { val byteArrayOutputStream = ByteArrayOutputStream() val objectOutputStream = ObjectOutputStream( byteArrayOutputStream ) objectOutputStream.writeObject(obj) var serStr = byteArrayOutputStream.toString("ISO-8859-1") serStr = java.net.URLEncoder.encode(serStr, "UTF-8") objectOutputStream.close() byteArrayOutputStream.close() return serStr } /** * 反序列化對象 * @param str * * * @return * * * @throws IOException * * * @throws ClassNotFoundException */ @Suppress("UNCHECKED_CAST") @Throws(IOException::class, ClassNotFoundException::class) private fun <A> deSerialization(str: String): A { val redStr = java.net.URLDecoder.decode(str, "UTF-8") val byteArrayInputStream = ByteArrayInputStream( redStr.toByteArray(charset("ISO-8859-1")) ) val objectInputStream = ObjectInputStream( byteArrayInputStream ) val obj = objectInputStream.readObject() as A objectInputStream.close() byteArrayInputStream.close() return obj } }
版權(quán)聲明:
作者:ttylinux
本文版權(quán)歸作者,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
浙公網(wǎng)安備 33010602011771號