Kotlin之數據類和單例類

Kotlin中特有的幾個知識點

數據類

在一個規範的系統架構中,數據類通常佔據着非常重要的角色,用於將服務器或者數據庫中的數據映射到內存當中,爲編程邏輯提供數據模型支持

數據類通常要重寫equals()、hashCode()、toString()這幾個方法. equals()用來判斷是否相等. hashCode()作爲equals()配套方法,也需要一起重寫,否則會導致HashMap、HashSet、等hash相關的系統類無法正常工作. toString()方法用來提供更詳細的日誌,否則只會打印出來內存地址

Java實現的話:

public class Test {
    private String ta;
    private double tb;

    public Test(String ta, double tb) {
        this.ta = ta;
        this.tb = tb;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Test test = (Test) o;
        return Double.compare(test.tb, tb) == 0 &&
                Objects.equals(ta, test.ta);
    }

    @Override
    public int hashCode() {
        return Objects.hash(ta, tb);
    }

    @Override
    public String toString() {
        return "Test{" +
                "ta='" + ta + '\'' +
                ", tb=" + tb +
                '}';
    }
}

看上去非常複雜,關鍵是還沒有任何意義,以上只是爲了讓他擁有數據類的功能而已

如果使用Kotlin來實現:

data class Test(val ta: String, val tb: Double)

是的,就只需要加上一個data關鍵字就可以了,當你在一個類前面聲明瞭data關鍵字時就表明你希望這是一個數據類,Kotlin會根據主構造函數中的參數幫你將equals()、hashCode()、toString()等固定且無實際邏輯意義的方法自動生成,從而大大減少了開發的工作量

當一個類沒有任何代碼時,還可以將尾部的大括號省略

驗證一下:

val test = Test("aa", 23.2)
val test1 = Test("aa", 23.2)

print(test == test1)

此時輸出是true,如果去掉data,輸出則是false

單例類

單例模式是最基礎最常用的設計模式之一,可以用於避免重複對象的創建

核心要點:私有化構造函數,避免外部直接創建,然後對外暴露靜態方法用於獲取當前對象實例

雖然Java中的單例實現並不複雜,但Kotlin做的更好,他將一些固定的、重複的邏輯隱藏起來,只暴露給我們最簡單方便的用法

在Kotlin中創建單例十分簡單,只需要將class改爲object就可以,當然,studio也提供創建單例類的方式,創建類型選擇Object就可以了

object Singleton {
}

現在他已經是單例類了,我們可以直接編寫需要的函數:

object Singleton {
    fun test() {
        print("========")
    }
}

不需要我們私有構造,也不需要提供靜態方法,調用方式類似Java調用靜態方法:

Singleton.test()

看上去只是靜態方法的調用,但是Kotlin幫我們在背後自動創建了Singleton類實例,並且保證全局唯一

微信掃描二維碼,關注我的公衆號
歡迎關注這個不是技術號的公衆號,我們聊聊別的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章