一、數據類
數據類通常需要重寫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實例。