Kotlin基礎(6)-->數據類與單例類

一、數據類

數據類通常需要重寫equals(),hashCode(),toString()這幾個方法。
equals():用於判斷兩個數據類是否相等
hashCode():作爲equals()的配套方法,也需要一起重寫,否則會導致HashMap、HashSet等Hash相關的系統類無法正常工作
toString():用於提供更清晰的輸入日誌

如果我們使用Java來實現一個數據類:

public class Phone {
    double price;
    String brand;

    public Phone(double price, String brand) {
        this.price = price;
        this.brand = brand;
    }

    @Override
    public boolean equals(@Nullable Object obj) {
        if (obj instanceof Phone) {
            Phone phone = (Phone) obj;
            return phone.brand.equals(brand) & phone.price == price;
        }
        return false;
    }

    @Override
    public int hashCode() {
        return brand.hashCode() + (int) price;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "price=" + price +
                ", brand='" + brand + '\'' +
                '}';
    }
}

看上去很複雜,而且這些代碼都是沒有實際意義的代碼,只是爲了讓他擁有數據類型的功能而已。我們看Kotlin怎麼實現數據類:

data class Phone(val brand: String, val price: Double) 

是的你沒看錯,就只需要一行代碼。
在一個類前面聲明瞭data關鍵字,就表示你希望這個類是一個數據類,Kotlin會根據主構造函數中的參數幫你將equals(),hashCode(),toString()等固定且無實際意義的代碼自動生成,大大減少了開發量。

另外,當一個類中沒有任何代碼時,還可以將尾部的大括號省去。

二、單例類

在Java中我們寫一個單例類,有懶漢式、餓漢式、雙重加鎖這幾種,都是需要私有化構造方法,給外部提供一個getInstance()靜態方法用於獲得單例類的實例。雖然也不復雜,但是Kotlin明顯做的更好:

object Singleton {
    fun singletonTest() {
        println("singletonTest is called ")
    }
}

沒錯,我們只需把class改爲object關鍵字,一個單例類就創建完成了。調用也很簡單:

fun main() {
    Singleton.singletonTest()
    //輸出日誌:singletonTest is called
}

這種寫法看上去像是靜態方法的調用,但其實Kotlin在背後自動幫我們創建了一個Singleton的實例,並且保證全局只會存在一個Singleton實例。

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