首頁 後端開發 C#.Net教程 詳解Kotlin中如何實作類似Java或C#中的靜態方法

詳解Kotlin中如何實作類似Java或C#中的靜態方法

Jun 04, 2017 am 09:41 AM

Kotlin中如何實作類似Java或C#中的靜態方法,本文總結了幾種方法,分別是:套件層級函數、伴生物件、擴充函數和物件宣告。這需要大家根據不同的情況來選擇。

大家可以在網路上搜到不少這樣的文章,官方推薦是包級函數,也有人說用伴生對象(companion class)。這些都是不錯的選擇,但並不完善,我們在不同的情況下有更好的選擇。我總結了幾種方法,分別是:包級函數、伴生物件、擴展函數和物件聲明。這需要大家根據不同的情況來選擇。

一、套件級函數

Kotlin和Java及C#不同的是,可以在套件裡面直接宣告函數##​​#。做法和類別中是一樣的,這裡就不多說了,的確是一個非常好的選擇。適用於函數不需要不包內部的類別進行資料共享的方法。

二、伴生物件

從語意上來講,伴生函數與Java中靜態方法最為相近,所以用伴生物件完全可以實現Java中靜態類的所有內容。但在Java中使用靜態方法有時是沒有辦法的選擇,在Kotlin中伴生物件只是我們的選擇。下面我就介紹一下伴生對象。

大家在使用Java的時不知有沒有註意到,Java類別中的靜態
變數及方法是在什麼時候初始化的?是在靜態方法第一次呼叫時還是在對應的Java類別被載入時?答案是在Java類別被載入時(也就是說如果你呼叫過Java類別中的實例變數及方法後,即使你沒有使用靜態變數及方法,靜態變數已經初始化了)。這種現像用伴生來描述是不是很貼切。

在Kotlin中,認為一個類別中有兩類東東,一類是Java類別中的實例變數及方法,另一類別是Java類別中的靜態變數及方法。 Kotlin將靜態實例及方法統一打包到一個伴生類別中,就是這個樣子啦。下面給一個例子:

fun main(args: Array<String>) {
 Books.getBestSellers()
}
class Books(var name: String, val page: Int) {
  fun getWordCount()=page*100
  companion object ComBooks{
    var bestSellers=arrayOf("Harry Potter\r\t","Lord of the Rings\r\t")
    fun getBestSellers() {
      bestSellers.forEach{v->println(v)}
    }
  }
}
登入後複製

伴生類別是用companion來宣告的,他在伴生物件所在的類別被加載,伴生物件被初始化,與Java靜態成員一樣。其可以匿名或與包含他的類別類別名稱相同。呼叫有兩種:

Books.ComBooks.getBestSellsers()?Books.getBestSellsers()?。

三、擴充函數

在Java中,我們常用寫Utils類,這些類別往往都是針對某一個物件對其功能進行與自身程式相符的操作。其中的方法以靜態方法居多,比方說:

public class Utils {

  public static boolean isEmpty(String string){
    return string != null && string.length() == 0;
  }

  public static boolean isWeakEmpty(String string){
    return isEmpty(string) && string.trim().length() == 0;
  }
}
登入後複製

我們當然可以用上面的兩種方法來實作這些靜態方法,但是我們有更好的方法。

fun String.isEmpty() = this != null && this.length == 0;

fun String.isWeakEmpty()= this.isEmpty() && this.trim().length == 0
登入後複製

上面兩行程式碼給String這個類別擴展了兩個函數,這兩個函數就可以像其原生函數一樣調用,程式碼十分優美。其實擴充函數並沒有修改String類別內部的東東,也只是為String加了兩個靜態函數,但相較於Java的Utils類,可讀性有了非常大的提升。


四、物件宣告

繼續考慮上面的Utils類,這個類別中所有的方法(有時也有可能有變數)都是靜態的,這個方法根本沒有必要實例化,在Java中我們經常將此種類聲明為靜態類,在Kotlin中針對這種情況有沒有好的對應方案呢?有沒有比伴生對象更好的方案呢?當然是有的,對象聲明就是一種。


對象宣告非常好理解,就是用object關鍵字宣告了一個對象,物件裡面可以用變數也可以有方法,如:

object AppInfo{
  var AppName = "Kotlin Message"
  var AppAuthor = "Riley Ge"
  fun toSimpleString() {
    println("AppName:$AppName,AppAuthor:$AppAuthor") 
  }
}
登入後複製

發現Kotlin的對象真是強大!有一點大家注意一下,AppInfo是在第一次被訪問到時延遲初始化的,也就是說在物件聲明時AppInfo並沒有初始化。


五、總結

說了這麼多方法,現在沒有人在擔心Kotlin沒有靜態方法了吧,Kotlin沒有隻是因為他可以做的更好。而且Kotlin也給了大家更多的選擇,大家可以依照自己的實際狀況選用合適的方法,讓自己的程式碼有效率又優美。


以上是詳解Kotlin中如何實作類似Java或C#中的靜態方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

C#與C:歷史,進化和未來前景 C#與C:歷史,進化和未來前景 Apr 19, 2025 am 12:07 AM

C#和C 的歷史與演變各有特色,未來前景也不同。 1.C 由BjarneStroustrup在1983年發明,旨在將面向對象編程引入C語言,其演變歷程包括多次標準化,如C 11引入auto關鍵字和lambda表達式,C 20引入概念和協程,未來將專注於性能和系統級編程。 2.C#由微軟在2000年發布,結合C 和Java的優點,其演變注重簡潔性和生產力,如C#2.0引入泛型,C#5.0引入異步編程,未來將專注於開發者的生產力和雲計算。

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP的影響:網絡開發及以後 PHP的影響:網絡開發及以後 Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP與Python:用例和應用程序 PHP與Python:用例和應用程序 Apr 17, 2025 am 12:23 AM

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

c#.net的持續相關性:查看當前用法 c#.net的持續相關性:查看當前用法 Apr 16, 2025 am 12:07 AM

C#.NET依然重要,因為它提供了強大的工具和庫,支持多種應用開發。 1)C#結合.NET框架,使開發高效便捷。 2)C#的類型安全和垃圾回收機制增強了其優勢。 3).NET提供跨平台運行環境和豐富的API,提升了開發靈活性。

從網絡到桌面:C#.NET的多功能性 從網絡到桌面:C#.NET的多功能性 Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#作為多功能.NET語言:應用程序和示例 C#作為多功能.NET語言:應用程序和示例 Apr 26, 2025 am 12:26 AM

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。

See all articles