<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      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
          }
      
      }

       

      主站蜘蛛池模板: 国产美女被遭强高潮免费一视频| 少妇又爽又刺激视频| 国产偷窥熟女高潮精品视频| 国产jlzzjlzz视频免费看| 又粗又大又黄又硬又爽免费看| 亚洲伊人久久大香线蕉| 亚洲欧美中文字幕日韩一区二区| 蜜桃av无码免费看永久| 国产欧美久久一区二区三区| 公喝错春药让我高潮| 人妻中文字幕亚洲一区| 无码人妻久久一区二区三区app| 亚洲另类激情专区小说图片| 日韩一区二区三区水蜜桃| 亚洲国产日韩欧美一区二区三区| 国产一区二区三区在线观| 成人一区二区不卡国产| 欧洲亚洲精品免费二区| 国产在线精品欧美日韩电影| 成人亚洲狠狠一二三四区| 久久夜色精品国产亚av| 摸丰满大乳奶水www免费| 亚洲国产成人不卡高清麻豆| 无码国模国产在线观看免费| 在线高清免费不卡全码| 黑人好猛厉害爽受不了好大撑| 97精品国产91久久久久久久| 久播影院无码中文字幕| 仪征市| 日韩在线视频线观看一区| 亚洲欧美日韩久久一区二区| 免费人成视频在线视频电影| 中文国产人精品久久蜜桃| 中文字幕色偷偷人妻久久| 亚洲中文字幕精品第三区| 亚洲欧美偷国产日韩| 99精品人妻少妇一区二区| 国产一级精品在线免费看| 亚洲a成人片在线观看| 不卡在线一区二区三区视频| 亚洲熟妇精品一区二区|