詳解Kotlin中如何實現類似Java或C#中的靜態(tài)方法
大家可以在網絡上搜到不少這樣的文章,官方推薦是包級函數,也有人說用伴生對象(companion class)。這些都是不錯的選擇,但并不完善,我們在不同的情況下有更好的選擇。我總結了幾種方法,分別是:包級函數、伴生對象、擴展函數和對象聲明。這需要大家根據不同的情況進行選擇。
一、包級函數
Kotlin和Java及C#不同的是,可以在包里面直接聲明函數。做法和類中是一樣的,這里就不多說了,的確是一個非常好的選擇。適用于函數不需要不包內部的類進行數據共享的方法。
二、伴生對象
從語義上來講,伴生函數與Java中靜態(tài)方法最為相近,所以用伴生對象完全可以實現Java中靜態(tài)類的所有內容。但在Java中使用靜態(tài)方法有時是沒有辦法的選擇,在Kotlin中伴生對象只是我們的一種選擇。下面我就介紹一下伴生對象。
大家在使用Java的時不知有沒有注意到,Java類中的靜態(tài)變量及方法是在什么時候初始化的?是在靜態(tài)方法第一次調用時還是在相應的Java類被加載時?答案是在Java類被加載時(也就是說如果你調用過Java類中的實例變量及方法后,即使你沒有使用靜態(tài)變量及方法,靜態(tài)變量已經初始化了)。這種現象用伴生來描述是不是很貼切。
在Kotlin中,認為一個類中有兩類東東,一類是Java類中的實例變量及方法,另一類是Java類中的靜態(tài)變量及方法。Kotlin將靜態(tài)實例及方法統(tǒng)一打包到一個伴生類中,就是這個樣子啦。下面給出一個例子:
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靜態(tài)成員一樣。其可以匿名或者與包含他的類類名相同。調用有兩種: Books.ComBooks.getBestSellsers()?
或 Books.getBestSellsers()?。
三、擴展函數
在Java中,我們經常用寫Utils類,這些類往往都是針對某一個對象對其功能進行與自身程序相匹配的操作。其中的方法以靜態(tài)方法居多,比方說:
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; } }
我們當然可以用上面的兩種方法來實現這些靜態(tài)方法,但是我們有更好的方法。
fun String.isEmpty() = this != null && this.length == 0; fun String.isWeakEmpty()= this.isEmpty() && this.trim().length == 0
上面兩行代碼給String這個類擴展了兩個函數,這兩個函數就可以像其原生函數一樣調用,代碼十分優(yōu)美。其實擴展函數并沒有修改String類內部的東東,也只是給String加了兩個靜態(tài)函數,但相比Java的Utils類,可讀性有了非常大的提高。
四、對象聲明
繼續(xù)考慮上面的Utils類,這個類中所有的方法(有時也有可能有變量)都是靜態(tài)的,這個方法根本沒有必要實例化,在Java中我們經常將此種類聲明為靜態(tài)類,在Kotlin中針對這種情況有沒有好的對應方案呢?有沒有比伴生對象更好的方案呢?當然是有的,對象聲明就是一種。
對象聲明非常好理解,就是用object關鍵字聲明了一個對象,對象里面可以用變量也可以有方法,如:
object AppInfo{ var AppName = "Kotlin Message" var AppAuthor = "Riley Ge" fun toSimpleString() { println("AppName:$AppName,AppAuthor:$AppAuthor") } }
發(fā)現Kotlin的對象真是強大!有一點大家注意一下,AppInfo是在第一次被訪問到時延遲初始化的,也就是說在對象聲明時AppInfo并沒有初始化。
五、總結
說了這么多方法,現在沒有人在擔心Kotlin沒有靜態(tài)方法了吧,Kotlin沒有只是因為他可以做的更好。而且Kotlin也給了大家更多的選擇,大家可以根據自己的實際情況選用合適的方法,讓自己的代碼高效而優(yōu)美。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java?Web實戰(zhàn)之使用三層架構與Servlet構建登錄注冊模塊
這篇文章介紹了如何使用三層架構(View,?Service,?DAO)和JDBCTemplate技術在JavaWeb環(huán)境下實現登錄和注冊功能,詳細說明了構建項目的步驟,包括創(chuàng)建數據庫表、實體類、DAO層、Service層、Servlet處理及頁面設計,需要的朋友可以參考下2024-10-10Kotlin + Spring Boot 請求參數驗證的代碼實例
本篇文章主要介紹了Kotlin + Spring Boot 請求參數驗證的代碼實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07關于Spring?Cache?緩存攔截器(?CacheInterceptor)
這篇文章主要介紹了關于Spring?Cache緩存攔截器(?CacheInterceptor),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12舉例講解Java的Spring框架中AOP程序設計方式的使用
這篇文章主要介紹了Java的Spring框架中AOP程序設計方式的使用講解,文中舉的AOP下拋出異常的例子非常實用,需要的朋友可以參考下2016-04-04