Kotlin 中為什么沒有靜態變量和靜態方法—不用static?

Kotlin 的設計核心是:

  1. 一切皆對象:消除?static?的「非對象」特性,用?companion(對象)和頂層函數(包級對象)替代,讓代碼更統一。
  2. 避免全局狀態濫用static?成員是全局可見的,易導致隱性依賴;而?companion?依附于類,object?單例明確作用域,更易維護。
  3. 簡化語法:頂層函數直接調用,object?單例無需?new,比 Java 的靜態方法更簡潔。

本質需求:編程中常需要「不依賴對象實例就能調用的成員」(如工具類方法、全局變量),Java 用?static?實現,而 Kotlin 為了一切皆對象和簡化語法等設計目標,舍棄了?static

在 Kotlin 中,不依賴對象實例就能調用的成員,本質上都是為了實現「類級 / 全局共享功能」。有三種實現方式,但設計目標不同,使用場景不同。

一、companion(伴生對象)

核心邏輯:

  • 伴生對象是類的「官方搭檔」:每個類默認有一個?companion object(可簡寫成?companion),它依附于類存在,生命周期與類綁定,全局唯一。
  • 通過類名直接調用:伴生對象的成員可通過?類名.成員?訪問,看似類似?static,但本質是對象的成員(伴生對象是一個真實的?object?實例)。
  • 設計哲學:Kotlin 希望「少用靜態,多用對象」,伴生對象讓類的功能更內聚(屬于類的一部分),避免全局變量 / 函數的無序性。

二、頂層函數 / 屬性(Top-Level Functions/Properties)

  • 本質:直接定義在包(package)下的函數 / 屬性,不屬于任何類,相當于全局作用域的「自由成員」。
  • 調用方式:直接通過函數名調用,或導入后調用(類似 Python 的模塊函數)。
  • 設計目標:替代 Java 的「工具類靜態方法」(如?Collections.sort()),避免為工具函數創建無狀態的類(如 Java 的?Utils?類)。
// 在文件頂部直接定義(不屬于任何類)
fun printMessage() { // 頂層函數println("Hello from top-level function!")
}
val globalVersion = "1.0" // 頂層屬性
// 調用方式:直接用函數名/屬性名
printMessage() // 輸出:Hello from top-level function!
println(globalVersion) // 輸出:1.0

三、object`聲明的單例類

  • 本質:用?object?關鍵字聲明一個全局唯一的實例(單例模式的極簡寫法),無需?new?即可直接調用其成員。
  • 調用方式:通過?對象名.成員?調用(類似靜態調用,但本質是單例對象)。
  • 設計目標:替代 Java 的「枚舉單例」或?getInstance()?模式,用更簡潔的語法創建有狀態的全局實例。
object AppConfig { // 單例對象var theme = "light"fun setTheme(theme: String) {this.theme = theme}
}
// 調用方式:直接用對象名訪問
AppConfig.theme = "dark" // 修改單例對象的狀態
AppConfig.setTheme("light") // 調用單例對象的方法

總結:三種方式的適用場景

方式本質核心設計目標典型場景
companion object類的「官方搭檔」對象替代?static,實現類級共享功能類的工廠方法、類的元數據(如 TAG)
頂層函數 / 屬性全局自由成員簡化工具函數,避免無意義的類通用工具函數(如?StringUtils
object?單例全局唯一實例極簡單例模式,支持狀態存儲全局配置中心、日志管理器

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

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

相關文章

VSCode性能調優:從卡頓到絲滑的終極方案

? 核心價值 "這套配置使某金融核心系統VS Code內存占用從8GB降至1.2GB,加載速度提升15倍" —— 2024某銀行效能優化報告 ?? 性能瓶頸拆解 一、百萬行項目優化方案 ?? 黃金配置參數 // settings.json(核彈級優化) {"files.watcherExclude": {"…

以云織夢,渡數濟世:輝瑞與亞馬遜云科技共譜醫藥新樂章

胖頭陀科技 編輯:沐由 【導讀】“用合規的數據來幫助患者,成為患者回歸健康的一味新藥。”當下,在數字洪流的浪潮中,這味“良藥”正沿著云和AI的脈絡,奔向有需求的千家萬戶…… 如果說到Pfizer,估計十個人…

SpringBoot后端開發知識點總結(持續更新)

目錄 1. 常用易混淆注解解釋1.1 Resource和Autowired注解的區別1.2 PathVariable和RequestParam注解的區別 2. Mybatis-Plus高級特性2.1 強大的通用CRUD接口2.2 代碼生成器 3. IDEA實用快捷鍵4. 前后端聯調關鍵點4.1 代碼示例4.2 聯調要點4.3 調試技巧 1. 常用易混淆注解解釋 …

電腦商城--用戶收貨管理

新增收貨地址 1 新增收貨地址-創建數據表 1.使用use命令先選中store數據庫。 USE store; 2.在store數據庫中創建t_address用戶數據表。 CREATE TABLE t_address (aid INT AUTO_INCREMENT COMMENT 收貨地址id,uid INT COMMENT 歸屬的用戶id,name VARCHAR(20) COMMENT 收貨人姓…

開發者避坑:接入Flux-Kontext API實現文生圖、圖生圖功能

在數字化浪潮背景下,人工智能(Artificial Intelligence, AI)技術正加速重塑圖像創作領域。智創聚合API平臺近日宣布整合Flux-Kontext系列模型,通過API接口支持圖生圖和文生圖功能,為開發者及創作者提供高效解決方案。此…

.Net Core 獲取與bin目錄相同文件路徑的文件

在 .NET Core 中,您可以使用以下方法來獲取與 bin 目錄相同的文件路徑。通常,bin 目錄是應用程序編譯后生成的輸出目錄,您可以使用 AppContext.BaseDirectory 或 Directory.GetCurrentDirectory() 來獲取該目錄的路徑。 以下是一些常用的方法…

RN(React Native)技術應用中常出現的錯誤及解決辦法

React Native 作為跨平臺開發框架,在實際應用中可能會遇到一些常見的錯誤。以下是React Native 技術應用中常出現的錯誤及解決辦法: 1. 網絡請求失敗(Network Request Failed) 原因: 請求地址不正確網絡權限未配置i…

Java 21 的虛擬線程與橋接模式:構建高性能并發系統

Java 21 的虛擬線程與橋接模式:構建高性能并發系統 🌟 嗨,我是IRpickstars! 🌌 總有一行代碼,能點亮萬千星辰。 🔍 在技術的宇宙中,我愿做永不停歇的探索者。 ? 用代碼丈量世界&…

HTML5 火焰字體效果教程

HTML5 火焰字體效果教程 這里寫目錄標題 HTML5 火焰字體效果教程前言項目概述基本原理項目結構詳細實現步驟1. HTML結構2. CSS樣式3. JavaScript實現 代碼詳解1. 初始化設置2. 粒子系統3. 生成粒子4. 動畫循環5. 交互控制 擴展和優化建議總結完整代碼 前言 在這篇教程中&#…

SMOTE-XGBoost實戰:金融風控中欺詐檢測的樣本不平衡解決方案

1. 行業問題背景 (1)金融欺詐檢測的特殊性 在支付風控領域,樣本不平衡是核心痛點。Visa 2023年度報告顯示,全球信用卡欺詐率約為0.6%,但單筆欺詐交易平均損失高達$500。傳統機器學習模型在此場景下表現堪憂&#xff1…

Instagram下載保存 -下載狗解析工具

在日常瀏覽Instagram時,是否有過這樣的煩惱:看到一個精彩的視頻,想要保存下來,卻不知道如何操作?有時候我們會看到一些特別的旅行視頻、搞笑片段,甚至是喜歡的名人分享的內容,簡直是舍不得錯過。…

flink如何基于Pekko實現RPC調用

摘要 通過閱讀flink源碼,了解flink是如何基于Pekko實現遠程RPC調用的 Pekko實現遠程調用 Flink 的 RPC 框架底層是構建在 Pekko 的 actor 模型之上的,了解Pekko如何使用,對后續源碼的閱讀有幫助。 Apache Pekko(原為 Akka 的一…

Kafka節點注冊沖突問題分析與解決

一、核心錯誤分析 ERROR Error while creating ephemeral at /brokers/ids/1, node already exists and owner does not match org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode NodeExists問題本質:ZooKeeper中已存在ID為1的broker節…

突破PPO訓練效率瓶頸!字節跳動提出T-PPO,推理LLM訓練速度提升2.5倍

突破PPO訓練效率瓶頸!字節跳動提出T-PPO,推理LLM訓練速度提升2.5倍 在大語言模型(LLM)通過長思維鏈(CoT)展現出強大推理能力的當下,強化學習(RL)作為關鍵技術卻面臨訓練…

【Python】dictionary

1 字典功能 字典是可變容器模型&#xff0c;且可存儲任意類型對象&#xff1b; 字典的每個鍵值對 <key: value> 用冒號 : 分割&#xff0c;每個對之間用逗號(,)分割&#xff0c;整個字典包括在花括號 {} 中 ,格式如下所示&#xff1a; d {key1 : value1, key2 : value…

【python】If 語句

1 使用if 進行條件判斷 1.1 檢查字符串是否相等 car bmw car BMW # FALSEcar bmw car.upper() BMW # true # 變小寫用方法&#xff1a;lower1.2 檢查字符串是否不相等 my_car yadeaif my_car ! Audi:print("Buy one! Buy one! Buy one!")1.3 比較數字 answe…

Knife4j 使用詳解

一、概述 Knife4j 是一款基于 Swagger 的開源 API 文檔工具&#xff0c;旨在為 Java 開發者提供更美觀、功能更強大的 API 文檔生成、展示和調試體驗。它是 Swagger-Bootstrap-UI 的升級版&#xff0c;通過增強 UI 界面和擴展功能&#xff0c;解決了原生 Swagger UI 界面簡陋、…

Java excel坐標計算

package com.common.base.util.excel;/*** excel 坐標計算*/ public class UtilExcelPosi {/*** deepseek生成 ExcelProperty(index UtilExcelPosi.pA)*/public final static int pA 0;public final static int pB 1;public final static int pC 2;public final static i…

【JavaWeb】Servlet+JSP 實現分頁功能

文章目錄 思路數據抽出功能設計 功能模塊工具類前端內容用戶端數據處理 思路 數據抽出 需要顯示的數據&#xff0c;查詢的數據抽出&#xff1b;進行分頁顯示&#xff0c;需要統計抽出的件數&#xff0c;然后根據頁面顯示尺寸調整顯示頁面內容&#xff1b; 功能設計 翻頁需要…

SpringBoot-準備工作-工程搭建

目錄 1.創建空項目 2.檢查項目jdk版本 3.檢查Maven的全局配置 4.配置項目的字符集 5.創建SpringBoot工程 1.創建空項目 2.檢查項目jdk版本 3.檢查Maven的全局配置 4.配置項目的字符集 5.創建SpringBoot工程