編輯:關於android開發
作者:Antonio Leiva
時間:Jan 25, 2017
原文鏈接:https://antonioleiva.com/data-classes-kotlin/

在前面的文章中,我們已經見到了類,而數據類還可以進一步幫助我們簡化代碼。
數據類是僅僅包含狀態而沒有任何可執行的操作。
用數據類替換普通類的好處是Kotlin幫助我們產生大量的代碼。
特別是,它使我們省去如下工作:
這裡給出精彩的比較。盡管IDE能夠產生幾乎所有的代碼,但是在Java中,我們需要這樣實現數據類:
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的潛力,為我們節省大量無用代碼。
這是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項目。
Android--音樂播放器
Android--音樂播放器 1、什麼是Open Core? Open Core是 Android 多媒體框架的核心,所有 Android平台的音頻、視頻的采用以及播
Android Studio導入Project、Module的正確方法,androidproject
Android Studio導入Project、Module的正確方法,androidprojectGradle Project項目、Module模塊導入
QQ視差特效和ListView側滑刪除,視差特效listview側
QQ視差特效和ListView側滑刪除,視差特效listview側如圖所示是效果圖,當向下拉時,圖片會被拉出來,松手後恢復。和ListView的側滑刪除 &n
【React Native開發】React Native控件之ProgressBarAndroid進度條講解(12)
【React Native開發】React Native控件之ProgressBarAndroid進度條講解(12) (一)前言 今天我們一起來看一下進度加載條Pro
minSdkVersion maxSdkVersion targetSdkVersion target 的區別,targetsdkversion
minSdkVersion maxSdkVersion targetSd