做者:Antonio Leivaide
時間:Jan 25, 2017函數
原文連接:https://antonioleiva.com/data-classes-kotlin/學習
在前面的文章中,咱們已經見到了類,而數據類還能夠進一步幫助咱們簡化代碼。ui
數據類是僅僅包含狀態而沒有任何可執行的操做。this
用數據類替換普通類的好處是Kotlin幫助咱們產生大量的代碼。spa
特別是,它使咱們省去以下工做:code
這裏給出精彩的比較。儘管IDE可以產生幾乎全部的代碼,可是在Java中,咱們須要這樣實現數據類:component
1 public class Person { 2 3 private String name; 4 private String surname; 5 private String id; 6 7 public String getName() { 8 return name; 9 } 10 11 public void setName(String name) { 12 this.name = name; 13 } 14 15 public String getSurname() { 16 return surname; 17 } 18 19 public void setSurname(String surname) { 20 this.surname = surname; 21 } 22 23 public String getId() { 24 return id; 25 } 26 27 public void setId(String id) { 28 this.id = id; 29 } 30 31 @Override public boolean equals(Object o) { 32 if (this == o) return true; 33 if (o == null || getClass() != o.getClass()) return false; 34 35 Person person = (Person) o; 36 37 if (name != null ? !name.equals(person.name) : person.name != null) return false; 38 if (surname != null ? !surname.equals(person.surname) : person.surname != null) 39 return false; 40 return id != null ? id.equals(person.id) : person.id == null; 41 42 } 43 44 @Override public int hashCode() { 45 int result = name != null ? name.hashCode() : 0; 46 result = 31 * result + (surname != null ? surname.hashCode() : 0); 47 result = 31 * result + (id != null ? id.hashCode() : 0); 48 return result; 49 } 50 51 @Override public String toString() { 52 return "Person{" + 53 "name='" + name + ''' + 54 ", surname='" + surname + ''' + 55 ", id='" + id + ''' + 56 '}'; 57 } 58 }
而且,咱們仍未實現與Kotlin這一行代碼相同功能:對象
1 data class Person(var name: String, var surname: String, var id: String)
這裏咱們實實在在的看到Kotlin的潛力,爲咱們節省大量無用代碼。blog
這是componentX的用法。感謝它們,你可以以這種方法解析數據類中變量:
1 val person = Person("x", "y", "z") 2 val (n, s, i) = person
感謝這一切,你可以在循環內解析map鍵值對:
1 val map = mapOf(1 to "a", 2 to "b") 2 3 for ((key, value) in map) { 4 toast("key: $key, value: $value") 5 }
如咱們前面所談的,在每個可能的不變性狀況下,它是一個很好的實踐。若是咱們以不變實現前面類的:
1 data class Person(val name: String, val surname: String, val id: String)
如今要改變姓氏,就不能了。
當你以不可變方式運行,爲了改變對象狀態,你就須要複製它到新值。這就要用到copy函數:
1 val person = Person("John", "Smith", "123abc") 2 val person2 = person.copy(surname="Rogers")
Copy函數能夠儘量多的獲得你須要改變的參數值。如你所見,函數參數能夠命名,這樣你能夠指定你要改變哪個。
數據類能夠節省大量Java強制咱們產生樣板代碼,這樣最終代碼更易於理解和便於維護。
若是你喜歡這篇文章,你能夠獲得個人免費指南,繼續學習Kotlin,在指南中我展現瞭如何建立你的第一個Kotlin項目。