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

来源:http://www.cnblogs.com/figozhg/archive/2017/02/03/6363335.html
-Advertisement-
Play Games

作者:Antonio Leiva 時間:Jan 25, 2017 原文鏈接:https://antonioleiva.com/data-classes-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項目。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基本結構圖(重要) Director: 有那些作用? OpenGL ES的初始化,場景的轉換,游戲暫停繼續的控制,世界坐標和GL坐標之間的切換,對節點(游戲元素)的控制,游戲數據的保存調用,屏幕尺寸的獲取 控制場景的常用方法 runWithScene( Scene *scene ) 啟動游戲,並運行 ...
  • activity_home.xml home_list_item.xml style.xml color.xml HomeActivity.java 知識點: GirdView + BaseAdapter+點擊事件 自定義TextView ...
  • 作者:Antonio Leiva 時間:Feb 2, 2017 原文鏈接:https://antonioleiva.com/functional-operations-collections-kotlin/ 對於我來說,我必須承認用Java代碼處理列表是最令人沮喪的事之一。 在這方面,雖然Java ...
  • 根據功能模塊劃分(Android開發推薦此方法) - Activity mobilesafe.activty - 後臺服務 mobilesafe.service - 廣播接受者 mobilesafe.receiver - 資料庫 mobilesafe.db.dao - 對象(java bean) m ...
  • 在google play上發佈apk,當上傳了apk文件,填寫了相關的內容信息和介紹圖片、圖標後,出現“發佈應用”始終灰色無法點擊,查看原因顯示如下問題: 其中支持的設備數量始終顯示為0,懷疑是編譯出來的apk哪裡不規範! 經過對原有工程代碼的查找修改,去除了mips和x86兩個jniLibs下的鏈 ...
  • 學習視頻之後自己操作時的筆記。 0.視頻地址:http://www.imooc.com/video/3265 1.功能預覽: 說明:1)輸入錯誤用戶名和密碼,點擊登錄,彈出提示框“禁止登錄”; 2)輸入正確用戶名和密碼,點擊登錄,彈出提示框“登錄成功”; 3)輸入正確用戶名和密碼,並且勾選保存用戶名 ...
  • 沒有蘋果電腦打包iOS平臺的 Ionic 2程式——《Ionic 2 實例開發》更新內容春節剛過,祝各位新的一年裡萬事如意,一帆風順。《Ionic 2 實例開發》在這段時間里更新瞭如下內容:Ionic 2 中使用管道處理數據Ionic 2 中使用HTTP與遠程伺服器交互數據Ionic 2 中的樣式與 ...
  • 0.視頻地址:http://www.imooc.com/video/3265 1.使用SharePreferences存取數據: public class MainActivity extends Activity { @Override protected void onCreate(Bundle ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...