【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )
文章目錄
- I . 單例的懶漢式與惡漢式
- II . Java 中的懶漢式與惡漢式
- III . Kotlin 中對應(yīng) Java 的懶漢式與惡漢式
- IV . Kotlin 對象 ( object ) 聲明
- V . Kotlin 伴生對象 ( companion object )
- VI . ? 與 !! 作用
I . 單例的懶漢式與惡漢式
1 . 單例類簡介 : 單例是保證在應(yīng)用程序的內(nèi)存中 , 只存在一個實例的設(shè)計模式 ;
① 餓漢式 : 這個類只要一聲明對象 , 只要該類被調(diào)用到 , 不管有沒有用到其單例對象 , 必須馬上創(chuàng)建一個該單例對象 ( 類對象很餓 ) ;
② 懶漢式 : 聲明類對象時 , 什么都不做 , 只有類獲取單例對象時 , 才創(chuàng)建對象 ( 創(chuàng)建對象很懶 ) ; 只有類獲取單例對象時 , 才創(chuàng)建對象 ;
2 . 單例類特點 :
① 私有靜態(tài)化單例成員變量 ;
② 私有化構(gòu)造函數(shù) ;
③ 公共靜態(tài)獲取單例方法 ;
詳細的 Java 與 Kotlin 單例示例詳細看下面的四個示例
II . Java 中的懶漢式與惡漢式
1 . Java 餓漢式 單例模式 : 在類第一次被調(diào)用就創(chuàng)建單例對象 ;
package singleton.java;/*** 餓漢單例模式* 在類第一次被調(diào)用就創(chuàng)建單例對象*/ public class Student {// 1 . 私有靜態(tài)化單例成員變量 ( 餓漢模式 )private static Student student = new Student();// 2 . 私有化構(gòu)造函數(shù)private Student(){}// 3 . 公共靜態(tài)獲取單例方法public static Student getStudent(){return student;}}2 . Java 懶漢式 單例模式 : 在單例對象獲取時才創(chuàng)建單例對象 ;
package singleton.java;/*** 懶漢單例模式* 只有在單例對象獲取時才創(chuàng)建單例對象*/ public class Student {// 1 . 私有靜態(tài)化單例成員變量private static Student student;// 2 . 私有化構(gòu)造函數(shù)private Student(){}// 3 . 公共靜態(tài)獲取單例方法public static Student getStudent(){// 懶漢模式if(student == null){student = new Student();}return student;}}III . Kotlin 中對應(yīng) Java 的懶漢式與惡漢式
1 . Kotlin 餓漢單例模式 : Kotlin 餓漢單例模式很簡單 , 一行代碼即可實現(xiàn) , 該行代碼的作用等同于上面的 Java 中的 Student 餓漢式單例模式的一坨代碼 ;
package singleton.kotlin/*** 餓漢式單例模式實現(xiàn)* 被 object 關(guān)鍵字修飾的類時靜態(tài)類 , 該類的成員方法和變量都是靜態(tài)的* 調(diào)用時直接使用 Student.study() 即可調(diào)用該方法 */ object Student {fun study(){println("學習")} }該示例涉及到對象聲明 , 看下一小節(jié)說明 ;
2 . Kotlin 懶漢單例模式 : 該示例中涉及到了伴生對象 , 字段 getter 方法定義 , ? 和 !! 判空等額外知識點 ;
package singleton.kotlin/*** 懶漢式單例模式實現(xiàn)** 1 . 私有化構(gòu)造函數(shù)*/ class Student private constructor() {/*** 伴生對象*/companion object {// 2 . 私有化靜態(tài)變量 , 賦值為空// ? 符號表示該變量任何時候不會報空指針異常 , 該變量可以為 空 nullprivate var student : Student? = null//這是 Kotlin 中特有的 get set 方法定義方式// 在成員變量的下面可以直接定義該成員的 get() set() 方法get() {if (student == null){student = Student()}return student}// 3 . 公共 ( 默認 ) 靜態(tài)方法 , 獲取 student 成員// !! 表示該對象必須不能為空public fun getSingleton() : Student{return student!!}/*** 定義普通方法*/fun study(){println("學習")}}}//調(diào)用單例方法測試 fun main() {//伴生對象方法 可以直接使用 Student.伴生對象方法 進行調(diào)用//學習Student.study()//學習Student.Companion.study()}該示例涉及到伴生對象聲明 , getter 方法 , ? 和 !! 等知識點 , 看下一小節(jié)說明 ;
IV . Kotlin 對象 ( object ) 聲明
1 . object 對象聲明 : Kotlin 中使用 object 聲明一個 Student 類時 , 這個類是單例類 ;
object Student {fun study(){println("學習")} }2 . 單例類實例化時機 ( 餓漢模式由來 ) : 使用 object 聲明 Student 單例類后 , 會立刻實例化該單例類 , 相當于餓漢單例模式 ;
3 . 繼承特征 : object 修飾的單例類 , 可以繼承其它類 ;
4 . object 聲明的單例類對象調(diào)用 : 直接使用類名 Student 調(diào)用即可 , 該類名等同于單例對象 , 如調(diào)用上述單例類的 study() 方法 , 使用如下調(diào)用 ;
//調(diào)用 Student 單例對象的 Student.study()V . Kotlin 伴生對象 ( companion object )
1 . 伴生對象 : 類內(nèi)部的對象 , 使用 companion object 修飾 , 是伴生對象 ; 是類內(nèi)部的單例類 ;
2 . 伴生對象名稱 : 上面單例類的 懶漢模式 , 省略了伴生對象的名稱 , 這種情況下使用默認名稱 Companion ;
3 . 單例調(diào)用 : 可以直接使用類調(diào)用伴生對象的方法 , 上述定義的 Student 類 及伴生對象 , Student 與 Student.Companion 是等價的 ; 因此測試時 , 下面的兩個方法都是調(diào)用伴生對象的方法 ;
//調(diào)用單例方法測試 fun main() {//伴生對象方法 可以直接使用 Student.伴生對象方法 進行調(diào)用//學習Student.study()//學習Student.Companion.study()}VI . ? 與 !! 作用
? 和 !! 使用方式 : ? 和 !! 都是加在變量名后修飾變量名的 ;
① ? 作用 : 使用 ? 符號加在變量名后面 , 表示該變量可以被賦值成 null ;
② !! 作用 : 使用 !! 符號加在變量名后面 , 表示該變量不可以被賦值成 null ;
總結(jié)
以上是生活随笔為你收集整理的【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【RecyclerView】 一、Rec
- 下一篇: 【Kotlin】Kotlin Seale