在 Kotlin 中什么是委托屬性,簡要說說其使用場景和原理

在 Kotlin 中,屬性委托和類委托是兩種通過 by 關鍵字實現的強大特性,它們通過“委托”機制將行為或實現邏輯委托給其他對象,從而實現代碼的復用和解耦。

1 屬性委托

定義: 允許把屬性的 getset 方法的具體實現委托給另一個對象。

語法:

var/val 屬性名: 類型 by 委托對象

委托類的要求:

  • 對于 val(只讀屬性),需要實現 getValue()
  • 對于 var(可變屬性),需要實現 getValue()setValue()

常見的使用場景:

  • 延遲初始化:by lazy(首次訪問時才進行初始化);
  • 屬性監聽:Delegates.observable(屬性值發生變化時觸發回調);
  • 動態屬性存儲:從 Map 中讀取屬性(如解析 JSON 或配置);

示例:

class Person(val name: String, val age: Int)val person: Person by lazy {Person("Eileen", 34)
}var name: String by Delegates.observable("init data") { prop, old, new ->println("${prop.name}$old 變為 $new")
}class Student(val map: Map<String, Any>) {val name: String by map // 從 map 中按 key 取值val age: Int by map
}val student = Student(mapOf("name" to "Eileen", "age" to 30))
println(student.name) // Eileen

Kotlin 標準庫提供的委托工具:

  • lazy:延遲初始化;
  • Delegates.observable:監聽屬性變化;
  • Delegates.vetoable:在賦值前校驗值是否合法;
  • Delegates.notNull:非空屬性的延遲賦值;

2 類委托

定義:將類的接口實現委托給另一個對象,實現組合復用。 通過組合代替繼承,避免單繼承的局限性。

語法:

class 類名(委托對象): 接口 by 委托對象

典型場景:

  • 裝飾器模式:增強對現有對象的功能(如添加日志、緩存);
  • 接口實現復用:多個類共享同一接口的默認邏輯;
  • 動態替換行為:運行時切換委托對象(如策略模式);

示例:

interface DataFetcher {fun fetchData(): String
}class NetworkFetcher : DataFetcher {override fun fetchData() = "從網絡獲取數據"
}// 通過委托添加緩存功能
class CachedFetcher(private val fetcher: DataFetcher) : DataFetcher by fetcher {private var cachedData: String? = nulloverride fun fetchData(): String {return cachedData ?: fetcher.fetchData().also { cachedData = it }}
}fun main() {val networkFetcher = NetworkFetcher()val cachedFetcher = CachedFetcher(networkFetcher)println(cachedFetcher.fetchData()) // 第一次調用從網絡獲取println(cachedFetcher.fetchData()) // 第二次直接返回緩存
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82350.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82350.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82350.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI星智協腦:智能驅動的高效協作管理平臺全解讀

前言 想象一下&#xff1a;早上剛開電腦&#xff0c;十幾條未讀消息如機關槍般掃射而來&#xff0c;各路任務像隕石雨一樣砸向你&#xff0c;會議排得比熱播劇還密集&#xff0c;文檔版本堪比宮斗劇劇情反轉&#xff0c;同事圍著你轉圈追KPI&#xff0c;活脫脫一場《職場大逃殺…

Web 架構之數據讀寫分離

文章目錄 一、引言二、數據讀寫分離原理2.1 基本概念2.2 工作流程 三、數據讀寫分離的實現方式3.1 基于中間件實現3.2 應用程序層面實現 四、常見問題及解決方法4.1 數據一致性問題4.2 從數據庫負載均衡問題4.3 主從復制故障問題 五、思維導圖六、總結 一、引言 在 Web應用的開…

【軟件設計師:數據結構】1.數據結構基礎(一)

一 線性表 1.線性表定義 線性表是n個元素的有限序列,通常記為(a1,a2,…,an)。 特點: 存在惟一的表頭和表尾。除了表頭外,表中的每一個元素均只有惟一的直接前驅。除了表尾外,表中的每一個元素均只有惟一的直接后繼。2.線性表的存儲結構 (1)順序存儲 是用一組地址連續…

實踐005-Gitlab CICD全項目整合

文章目錄 環境準備環境準備集成Kubernetes Gitlab CICD項目整合項目整合整合設計 后端Java項目部署后端Java項目靜態檢查后端Java項目鏡像構建創建Java項目部署文件創建完整流水線 前端webui項目部署前端webui項目鏡像構建創建webui項目部署文件創建完整流水線 構建父子類型流水…

鴻蒙開發:dialog庫做了一些優化

前言 本文基于Api13 dialog庫是我去年5月份開發了一個便捷彈窗庫&#xff0c;主打一個使用簡單&#xff0c;一經推出&#xff0c;在dialog領域下載量穩居在前&#xff0c;可以說是非常受歡迎的&#xff1b;但是&#xff0c;之前的版本仍然有著可優化的空間&#xff0c;比如彈窗…

Windows 10 無法啟動或黑屏的修復指南(適用于更新失敗或磁盤故障)

Windows 10 無法啟動或黑屏的修復指南&#xff08;適用于更新失敗或磁盤故障&#xff09; 當 Windows 10 突然無法啟動&#xff08;黑屏、無限重啟、更新失敗后斷電等情況&#xff09;&#xff0c;很可能是由于啟動引導程序損壞或系統映像異常&#xff08;如系統磁盤出現壞道&…

MCP開發入門

MCP開發入門 官方文檔: https://modelcontextprotocol.io/introduction 入門教程: https://github.com/liaokongVFX/MCP-Chinese-Getting-Started-Guide 本文源代碼&#xff1a;https://github.com/youngqqcn/mcp-server-demo 什么是MCP&#xff1f; 模型上下文協議&#xff…

PX4開始之旅(二)通過自定義 MAVLink 消息與 QGroundControl (QGC) 通信

核心知識點&#xff1a;通過自定義 MAVLink 消息與 QGroundControl (QGC) 通信 1. 通俗易懂的解釋 想象一下&#xff0c;MAVLink 就像是無人機&#xff08;飛控&#xff09;和地面站&#xff08;QGroundControl&#xff09;之間約定好的一種“語言”。這種語言有很多標準的“…

AI視頻智能分析網關打造社區/工廠/校園/倉庫智慧消防實現精準化安全管控

一、背景 隨著社區、商業場所對消防安全要求日益提升&#xff0c;傳統消防系統已難以滿足智能化、精細化管理需求。智能分析網關融合物聯網與人工智能技術&#xff0c;具備強大的數據處理與分析能力&#xff0c;可全面升級消防系統。將其融入消防系統各層級&#xff0c;搭建智…

深度學習基礎--目標檢測常見算法簡介(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO)

博主簡介&#xff1a;努力學習的22級本科生一枚 &#x1f31f;?&#xff1b;探索AI算法&#xff0c;C&#xff0c;go語言的世界&#xff1b;在迷茫中尋找光芒?&#x1f338;? 博客主頁&#xff1a;羊小豬~~-CSDN博客 內容簡介&#xff1a;常見目標檢測算法簡介?&#x1f…

傳輸層協議UDP和TCP

傳輸層協議UDP和TCP 1、UDP2、TCP2.1、TCP協議段格式2.2、確認應答(ACK)機制2.3、超時重傳機制2.4、連接管理機制2.5、理解CLOSE_WAIT狀態2.6、理解TIME_WAIT狀態2.7、流量控制2.8、滑動窗口2.9、擁塞控制2.10、延遲應答2.11、捎帶應答2.12、面向字節流2.13、粘包問題2.14、TCP…

PMIC電源管理模塊的PCB設計

目錄 PMU模塊簡介 PMU的PCB設計 PMU模塊簡介 PMIC&#xff08;電源管理集成電路&#xff09;是現代電子設備的核心模塊&#xff0c;負責高效協調多路電源的轉換、分配與監控。它通過集成DC-DC降壓/升壓、LDO線性穩壓、電池充電管理、功耗狀態切換等功能&#xff0c;替代傳統分…

Ubuntu 配置網絡接口端點(靜態 IP 地址)詳細教程

在 Ubuntu 系統中&#xff0c;配置網絡接口端點通常指的是為您的有線或無線網卡設置一個固定的 IP 地址、子網掩碼、網關以及 DNS 服務器。這對于服務器或者需要穩定網絡標識的設備來說非常重要。 使用 Netplan (Ubuntu 17.10 及更高版本的默認方式)使用 ifupdown (通過 /etc/…

淺聊大模型-有條件的文本生成

大家好我是木木&#xff0c;自從2022年11月30日OpenAI發布ChatGPT后&#xff0c;大模型迅速火熱起來&#xff0c;人工智能作為當下最火的行業之一&#xff0c;2025年春節期間DeepSeek R1模型大火。LLM中有很多的技術&#xff0c;今天我們聊聊大模型-有條件的文本生成。 什么是…

華為銀河麒麟 V10(ARM)系統軟件部署全攻略:Redis、RabbitMQ、MySQL 等集群搭建指南

一、Redis 集群部署&#xff08;主從 哨兵模式&#xff09; 1. 環境準備 系統&#xff1a;華為銀河麒麟 V10&#xff08;ARM64&#xff09;節點&#xff1a;3 臺服務器&#xff08;1 主 2 從 3 哨兵&#xff09; 2. 安裝包下載 bash # 華為鏡像站 wget https://update.c…

Mysql數據庫進階

一、Mysql組織架構 連接層 1.驗證用戶的身份,用戶名密碼是否匹配 2.提供兩種連接方式(TCP/IP連接、socket連接) 3.連接層提供了一個與sql層交互的線程 SQL層 1.接收連接層傳過來的SQL語句 2.驗證執行的SQL語法 3.驗證SQL的語義(DDL,DML,DQL,DCL) 4.解析器:解析SQL語句,生…

系統思考:短期困境與長期收益

最近在項目中&#xff0c;一直有學員會提到一個議題&#xff0c;如何平衡當前困境和長期收益&#xff1f; 我的思考是在商業和人生的路上&#xff0c;我們常常聽到“魚和熊掌不可兼得”的說法&#xff0c;似乎短期利益和長期目標注定是對立的。但事實上&#xff0c;魚與熊掌是…

Spring Web MVC快速入門

什么是Spring Web MVC Spring Web MVC 是基于 Servlet API 構建的原始 Web 框架&#xff0c;從?開始就包含在 Spring 框架中。它的正式名稱“Spring Web MVC”來?其源模塊的名稱(Spring-webmvc)&#xff0c;但它通常被稱為"Spring MVC". View(視圖) 指在應?程序…

DeepSeek基于注意力模型的可控圖像生成

DeepSeek大模型高性能核心技術與多模態融合開發 - 商品搜索 - 京東 圖像的加噪與模型訓練 在擴散模型的訓練過程中&#xff0c;首先需要對輸入的信號進行加噪處理&#xff0c;經典的加噪過程是在圖像進行向量化處理后在其中添加正態分布&#xff0c;而正態分布的值也是與時間…

第十六屆藍橋杯B組第二題

當時在考場的時候這一道題目 無論我是使用JAVA的大數&#xff08;BIGTHGER&#xff09;還是賽后 使用PY 都是沒有運行出來 今天也是突發奇想在B站上面搜一搜 看了才知道這也是需要一定的數學思維 通過轉換 設X來把運算式精簡化 避免運行超時 下面則是代碼 public class lanba…