Kotlin伴生對象

你已經知道如何為類創建單例對象(singleton)。不過,在很多情況下,你只需要為某個類維護一個單例,這時候使用類的完整名字會顯得冗長。比如,你可能只需要存儲一個公共的屬性。這種情況下,可以用 Kotlin 的另一個特性 —— companion object(伴生對象)


伴生對象(Companion object)

在一個類內部,可以聲明一個用 companion 關鍵字標記的對象:

class Player(val id: Int) {companion object Properties {/* 默認玩家速度 - 每回合移動 7 格 */val defaultSpeed = 7fun calcMovePenalty(cell: Int): Int {/* 計算移動速度的懲罰 */}}
}/* 輸出 7 */
println(Player.Properties.defaultSpeed)

解釋:
伴生對象是綁定在外部類上的單例,必須通過外部類訪問它。它表明該對象與外部類有緊密聯系。比如,可以把所有玩家的默認速度存在 Player 類的伴生對象里。每個 Player 實例都會持有伴生對象的引用,訪問時都會得到這個唯一實例。


省略伴生對象名字

我們也可以不給伴生對象命名,這樣訪問時更加簡潔:

class Player(val id: Int) {companion object {val defaultSpeed = 7fun calcMovePenalty(cell: Int): Int {/* 計算移動懲罰 */}}
}/* 輸出 7 */
println(Player.defaultSpeed)

解釋:
省略名字后,仍然可以通過外部類直接訪問伴生對象的成員。如果需要,也可以用默認名字 Companion 訪問:

/* 依然輸出 7 */
println(Player.Companion.defaultSpeed)

伴生對象與外部類

伴生對象與外部類聯系非常緊密。在外部類中,可以直接使用伴生對象的屬性和方法:

class Deck {companion object {val size = 10val height = 2fun volume(bottom: Int, height: Int) = bottom * height}val square = size * size             // 100val volume = volume(square, height)  // 200
}

同名屬性的遮蔽(Shadowing)

如果外部類中有與伴生對象同名的屬性,會“遮蔽”伴生對象的同名屬性:

class Deck {companion object {val size = 10}val size = 2val square = size * size // 4,使用的是外部類的 size
}

如果想訪問伴生對象的 size,需要明確使用伴生對象的名字:

class Deck {companion object {val size = 10}val size = 2val square = Companion.size * Companion.size // 100
}

伴生對象不能訪問外部類實例成員

和嵌套對象類似,伴生對象不能訪問外部類的實例屬性和方法:

class Deck() {val size = 2object Properties {val defaultSize = size // 錯誤,無法訪問外部類的實例變量}
}

伴生對象的限制

  • 每個類最多只能有一個伴生對象,即使起不同名字也不行:
class BadClass {companion object Properties {}companion object Factory {}
}
// 編譯錯誤:每個類只能有一個伴生對象
  • 可以有一個伴生對象,同時擁有多個嵌套對象:
class Player(val id: Int) {companion object Properties {val defaultSpeed = 7fun calcMovePenalty(cell: Int): Int {// ...}}object Factory {fun create(playerId: Int): Player {return Player(playerId)}}
}println(Player.Properties.defaultSpeed) // 7
println(Player.defaultSpeed)             // 7
println(Player.Factory.create(13).id)   // 13
  • 伴生對象不能定義在另一個單例對象或伴生對象內部,因為這會違反全局訪問的原則:
object OuterSingleton {companion object InnerSingleton { // 編譯錯誤,伴生對象不能嵌套在對象中}
}

與其他語言的對比

如果你來自其他語言,可能會覺得伴生對象有點陌生。它類似于 Java 或 C++ 中的 static 成員,static 表示成員屬于類本身,而不是實例。比如,Java 中:

class Dog {public static int numOfPaws = 4;public static String createSound() {return "WUF-WUF";}
}/* 輸出 WUF-WUF */
System.out.println(Dog.createSound());

Kotlin 沒有 static 關鍵字,推薦用伴生對象來實現類似功能:

class Dog {companion object {val numOfPaws: Int = 4fun createSound(): String = "WUF-WUF"}
}/* 輸出 WUF-WUF */
println(Dog.createSound())

總結

  • 伴生對象是和類緊密關聯的單例對象。

  • 它是組織類級別數據和方法的好方式。

  • 在外部類中可以直接訪問伴生對象的成員,反之則不行。

  • 每個類只能有一個伴生對象。

  • 它是 Kotlin 中實現類靜態成員的推薦做法。

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

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

相關文章

4G車載錄像機的作用詳解:提升行車安全與智能管理的核心技術

1. 引言隨著物流運輸、公共交通、特種車輛等行業對安全與管理需求的提升,4G車載錄像機已成為現代車輛智能化管理的重要組成部分。它不僅具備傳統行車記錄儀的錄像功能,還結合4G無線通信、AI智能分析、GPS定位、云存儲等技術,實現遠程監控、實…

技術與情感交織的一生 (十)

目錄 笑傲江湖 上 恨 嫌隙 掙扎 救難 論道 取巧 聯手 入魔 決裂 治傷 聚氣 傾心 笑傲江湖 上 恨 身邊的許多朋友都是金庸武俠迷,我也是其中之一。有人說,我的技術像 “任我行” ,“吸星大法” 學到最后顯得不倫不類&#xf…

架構進階——解讀集團IT管控治理體系總體規劃【附全文閱讀】

集團IT管控治理體系正步入高質量發展階段,旨在重塑信息化管理價值,解決集團化管理的核心挑戰。首要問題是縱向與橫向的協同管控,需明確各層級在集團戰略決策中的角色與責任,促進跨部門、跨子公司的高效協同。高管激勵機制與人才梯…

亞馬遜自養號測評實戰指南:從環境搭建到安全提排名

在亞馬遜平臺上,自養號測評系統的成敗差異主要源于技術合規性、操作精細度和風控策略的差異。以下是關鍵因素的分析:🔒 一、環境隔離與偽裝技術底層環境穩定性成功案例:采用獨立服務器硬件參數偽裝(如唯一MAC地址、IME…

CSS中的transform

在 CSS 中,transform 是用于用于用于對元素進行幾何變換的屬性,可實現旋轉、縮放、平移、傾斜等效果,且不會影響其他元素的布局(不會觸發重排)。以下是其核心用法和特性: 1. 基本語法 element {transform: …

MyBatis攔截器插件:實現敏感數據字段加解密

文章目錄一、寫在前面二、編碼實現1、注解2、攔截器插件3、配置插件4、實體類5、測試三、擴展1、優化點一、寫在前面 日常開發中,經常有一些敏感數據,直接寫入數據庫的話,很容易泄露。 本文基于mybatis攔截器插件,實現敏感數據的…

C++_Hello算法_隊列

隊列(queue)是一種遵循先入先出規則的線性數據結構。顧名思義,隊列模擬了排隊現象,即新來的人不斷加入隊列尾部,而位于隊列頭部的人逐個離開。 如圖 5-4 所示,我們將隊列頭部稱為“隊首”,尾部…

LeetCode 1.

問題描述 倆數之和: 給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。你可以按…

c練習-c基礎

#include <stdio.h>int main() {//打印數組中的最大值int arr[10];int max,i;for (i 0; i < 10; i){scanf_s("%d", &arr[i]);}max arr[0];for (i 0; i < 10; i){if(max < arr[i 1]){max arr[i 1];}}printf("數組中最大值&#xff1a;%…

Numpy科學計算(五分鐘小白從入門到精通)

2.1 numpy介紹numpy是Python中科學計算的基礎包。它是一個Python庫&#xff0c;提供多維數組對象、各種派生對象&#xff08;例如掩碼數組和矩陣&#xff09;以及用于對數組進行快速操作的各種方法&#xff0c;包括數學、邏輯、形狀操作、排序、選擇、I/O 、離散傅里葉變換、基…

從零掌握微服務通信安全:mTLS全解析

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 在云原生時代&#xff0c;微服務架構的普及帶來了靈活性和可擴展性&#xff0c;但也讓服務間通信的安全性成為核心挑戰。mTLS&#xff08;Mutual TLS&…

Node.js net.Socket.destroy()深入解析

socket.destroy() 是 Node.js net 模塊中用于強制銷毀 TCP 套接字的方法&#xff0c;比 socket.end() 更徹底。下面我將從多個方面全面講解這個方法。 基本用法 const net require(net);const server net.createServer((socket) > {// 強制銷毀套接字socket.destroy(); })…

vmware 克隆虛擬機,報錯:克隆時出錯:指定不存在的設備。然后電腦卡死,只能強制關機再開機。

vmware 克隆虛擬機&#xff0c;報錯&#xff1a;克隆時出錯:指定不存在的設備。然后電腦卡死&#xff0c;只能強制關機再開機。1、問題描述2、問題原因3、解決方法1、問題描述 vmware 版本&#xff1a;vmware workstation pro 17.6.3 克隆虛擬機時&#xff0c;創建完整克隆&am…

如何使用Python將任意PPT變為“智能模板”(解決 python-pptx 替換元素無法保留格式的問題,陰影、填充等屬性保留!)

文章目錄 ?? 介紹 ?? ?? 演示環境 ?? ?? 深入 OpenXML:格式保留的終極武器 ?? ?? 如何打造你自己的“格式保留”PPT模板? ?? 為什么格式會丟失? ??? 方案一:圖片的“格式移植”大法 ??? 實現代碼 ?? 原理解析 ?? 方案二:文本的“外科手術”大法…

學習python中離線安裝pip及下載package的方法

正常而言&#xff0c;Python 3.4及以上版本默認自帶pip工具?&#xff0c;無需額外安裝&#xff0c;如果需要單獨離線安裝pip&#xff0c;可以先使用DeepSeek查看指定操作系統能安裝的最高pip版本&#xff0c;然后在參考文獻1中現在指定版本的pip離線安裝文件&#xff0c;通常為…

liunx運維進階腳本

一、文件與目錄操作1.快速創建目錄樹mkdir -p project/{src,doc,test/{unit,integration}}創建嵌套目錄結構&#xff0c;避免逐層創建。2查找并刪除7天前的日志文件find /var/log -name "*.log" -mtime 7 -exec rm -f {} \;結合find和exec實現定時清理。3.批量重命名…

Apache Ignite 中的 SQL 模式(Schema)管理機制

這段內容講的是 Apache Ignite 中的 SQL 模式&#xff08;Schema&#xff09;管理機制。我們可以從幾個方面來理解&#xff1a; 一、什么是 Schema&#xff08;模式&#xff09;&#xff1f; 在 SQL 中&#xff0c;Schema 是數據庫對象&#xff08;如表、視圖等&#xff09;的…

分布式光伏發電多合一(也稱為五合一或者群調群控)終端,從功能、市場前景等等方面介紹

對于當下分布式光伏從業者&#xff0c;多合一終端經常被提及到。而且很多地區也有正常使用&#xff0c;目前來看&#xff0c;使用效果也是比較好的&#xff0c;滿足當下的使用要求。并且價格也是可以接受。下面從幾個方面簡單介紹一下。功能介紹 5G通信功能 設備內置 5G通信模組…

AWE2026啟動:加碼AI科技,雙展區聯動開啟產業新格局

7月22日&#xff0c;由中國家用電器協會主辦的2026年中國家電及消費電子博覽會&#xff08;AWE2026&#xff09;啟動發布會在上海舉行。據「TMT星球」了解&#xff0c;AWE2026將以“AI科技、慧享未來”為主題&#xff0c;首次啟用“一展雙區”的新模式&#xff0c;于2026年3月1…

Django基礎(六)———數據庫

前言上篇文章給大家介紹了DTL模板結構這篇文章將講述Django框架與MySQL數據庫的綜合使用一、Django配置連接數據庫在操作數據庫之前&#xff0c;首先先要連接數據庫&#xff0c;這里我們以配置MySQL為例來講解。Diango連接數據庫&#xff0c;不需要單獨的創建一個連接對象。 只…