最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Kotlin中如何實現(xiàn)類似Java或C#中的靜態(tài)方法

 更新時間:2017年05月31日 09:43:42   作者:嘎子  
Kotlin中如何實現(xiàn)類似Java或C#中的靜態(tài)方法,本文總結了幾種方法,分別是:包級函數(shù)、伴生對象、擴展函數(shù)和對象聲明。這需要大家根據(jù)不同的情況進行選擇。

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

一、包級函數(shù)

Kotlin和Java及C#不同的是,可以在包里面直接聲明函數(shù)。做法和類中是一樣的,這里就不多說了,的確是一個非常好的選擇。適用于函數(shù)不需要不包內(nèi)部的類進行數(shù)據(jù)共享的方法。

二、伴生對象

從語義上來講,伴生函數(shù)與Java中靜態(tài)方法最為相近,所以用伴生對象完全可以實現(xiàn)Java中靜態(tài)類的所有內(nèi)容。但在Java中使用靜態(tài)方法有時是沒有辦法的選擇,在Kotlin中伴生對象只是我們的一種選擇。下面我就介紹一下伴生對象。
大家在使用Java的時不知有沒有注意到,Java類中的靜態(tài)變量及方法是在什么時候初始化的?是在靜態(tài)方法第一次調(diào)用時還是在相應的Java類被加載時?答案是在Java類被加載時(也就是說如果你調(diào)用過Java類中的實例變量及方法后,即使你沒有使用靜態(tài)變量及方法,靜態(tài)變量已經(jīng)初始化了)。這種現(xiàn)象用伴生來描述是不是很貼切。

在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)成員一樣。其可以匿名或者與包含他的類類名相同。調(diào)用有兩種: Books.ComBooks.getBestSellsers()?Books.getBestSellsers()?。

三、擴展函數(shù)

在Java中,我們經(jīng)常用寫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;
  }
}

我們當然可以用上面的兩種方法來實現(xiàn)這些靜態(tài)方法,但是我們有更好的方法。

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

fun String.isWeakEmpty()= this.isEmpty() && this.trim().length == 0

上面兩行代碼給String這個類擴展了兩個函數(shù),這兩個函數(shù)就可以像其原生函數(shù)一樣調(diào)用,代碼十分優(yōu)美。其實擴展函數(shù)并沒有修改String類內(nèi)部的東東,也只是給String加了兩個靜態(tài)函數(shù),但相比Java的Utils類,可讀性有了非常大的提高。

四、對象聲明

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

對象聲明非常好理解,就是用object關鍵字聲明了一個對象,對象里面可以用變量也可以有方法,如:

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

發(fā)現(xiàn)Kotlin的對象真是強大!有一點大家注意一下,AppInfo是在第一次被訪問到時延遲初始化的,也就是說在對象聲明時AppInfo并沒有初始化。

五、總結

說了這么多方法,現(xiàn)在沒有人在擔心Kotlin沒有靜態(tài)方法了吧,Kotlin沒有只是因為他可以做的更好。而且Kotlin也給了大家更多的選擇,大家可以根據(jù)自己的實際情況選用合適的方法,讓自己的代碼高效而優(yōu)美。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 詳解Java設計模式編程中的Flyweight享元模式的開發(fā)結構

    詳解Java設計模式編程中的Flyweight享元模式的開發(fā)結構

    這篇文章主要介紹了Java設計模式編程中的Flyweight享元模式的開發(fā)結構,享元模式能夠最大限度地重用現(xiàn)有的同類對象,需要的朋友可以參考下
    2016-04-04
  • 詳解Java中的reactive stream協(xié)議

    詳解Java中的reactive stream協(xié)議

    Stream大家應該都很熟悉了,java8中為所有的集合類都引入了Stream的概念。優(yōu)雅的鏈式操作,流式處理邏輯,相信用過的人都會愛不釋手。本文將詳細介紹Java中的reactive stream協(xié)議。
    2021-06-06
  • java 接口回調(diào)實例詳解

    java 接口回調(diào)實例詳解

    這篇文章主要介紹了java 接口回調(diào)實例詳解的相關資料,所謂回調(diào)就是使用java中的多態(tài),需要的朋友可以參考下
    2017-07-07
  • IntelliJ IDEA語法報錯

    IntelliJ IDEA語法報錯"Usage of API documented as @since 1.6+"的解決

    今天小編就為大家分享一篇關于IntelliJ IDEA語法報錯"Usage of API documented as @since 1.6+"的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • MyBatis-Plus實現(xiàn)邏輯刪除功能解析

    MyBatis-Plus實現(xiàn)邏輯刪除功能解析

    這篇文章主要介紹了MyBatis-Plus實現(xiàn)邏輯刪除功能解析,有時候并不需要真正的刪除數(shù)據(jù),而是想邏輯刪除,方便數(shù)據(jù)恢復,MyBatis-Plus可以很方便的實現(xiàn)邏輯刪除的功能,需要的朋友可以參考下
    2023-11-11
  • Java版水果管理系統(tǒng)源碼

    Java版水果管理系統(tǒng)源碼

    這篇文章主要為大家詳細介紹了Java版水果管理系統(tǒng)源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Spring的refresh()方法相關異常解析

    Spring的refresh()方法相關異常解析

    這篇文章主要介紹了Spring的refresh()方法相關異常解析,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Spring-AOP 靜態(tài)普通方法名匹配切面操作

    Spring-AOP 靜態(tài)普通方法名匹配切面操作

    這篇文章主要介紹了Spring-AOP 靜態(tài)普通方法名匹配切面操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 深入淺析 Spring Boot Starter

    深入淺析 Spring Boot Starter

    Spring框架功能很強大,但是就算是一個很簡單的項目,我們也要配置很多東西。接下來通過本文給大家分享Spring Boot Starter 知識,感興趣的朋友一起看看吧
    2017-10-10
  • Java中常用的設計模式之單例模式詳解

    Java中常用的設計模式之單例模式詳解

    這篇文章主要為大家詳細介紹了Java中常用的設計模式之單例模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論

新乡县| 紫阳县| 土默特左旗| 温州市| 蒲城县| 景德镇市| 林西县| 洞口县| 探索| 诏安县| 昌宁县| 台北市| 徐汇区| 沂水县| 华容县| 澄迈县| 自治县| 巴青县| 阿克苏市| 北京市| 板桥市| 新乡市| 湘阴县| 通化市| 兰西县| 拜泉县| 喀喇沁旗| 梅河口市| 鹤峰县| 宜丰县| 永济市| 宜昌市| 邳州市| 西宁市| 永川市| 舒城县| 乌海市| 长寿区| 吴堡县| 沧州市| 宜城市|