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