Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Kotlin的數據類:節省很多行代碼(KAD 10),kotlin很多行

Kotlin的數據類:節省很多行代碼(KAD 10),kotlin很多行

編輯:關於android開發

Kotlin的數據類:節省很多行代碼(KAD 10),kotlin很多行


作者:Antonio Leiva

時間:Jan 25, 2017

原文鏈接:https://antonioleiva.com/data-classes-kotlin/

 

 

在前面的文章中,我們已經見到了類,而數據類還可以進一步幫助我們簡化代碼。

 

數據類是什麼?

 

數據類是僅僅包含狀態而沒有任何可執行的操作。

 

用數據類替換普通類的好處是Kotlin幫助我們產生大量的代碼。

 

特別是,它使我們省去如下工作:

  • 在構造函數中聲明屬性:這一技術不是數據類特有的,但是除了構造函數外,它避免了所有getter和setter模板。
  • equals() / hashCode()
  • 一組稱之為comopinentX(),稍後我們能夠了解到它們允許我們所做一些非常棒的事情。
  • Copy()方法在我們使用不可變對象時非常有用。

 

Java代碼與數據類如何比較

 

這裡給出精彩的比較。盡管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項目。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved