轉向Kotlin——數據類和封閉類

數據類和封閉類是Kotlin中的兩種特殊的類,今天一起了解一下。更多精彩內容也可以關注我的微信公眾號——Android機動車

數據類

數據類是Kotlin的一個語法糖。Kotlin編譯器會自動為數據類生成一些成員函數,以提高開發效率。

數據類的使用

無論是Java服務器開發還是Android開發,實體類自然是特別熟悉,它就是將Json格式轉化為一個只包含數據和基本操作方法的實體類,以方便網絡存取和數據庫存取。

我們總是需要一個類來表示數據,例如要表示一個用戶的數據,我們會創建一個User類,并通過構造器傳入兩個屬性:

class User(name: String, age: Int) {var mName = namevar mAge: Int = age
}
復制代碼

我們定義實體類,除了要保存數據之外,還需要輸出對象的值,比較對象等操作,前者會用到toString函數,后者會用到equals函數,如下:

var user1 = User("js", 20)
var user2 = User("lx", 12)println(user1)
println(user2)
println(user1.equals(user2))
復制代碼

輸出結果是:

User@3764951d
User@4b1210ee
false
復制代碼

從結果可以看出,輸出User的兩個對象時,調用了這兩個對象的toString方法,但toString函數默認會調用hashcode函數,輸出當前對象的hashcode,并在前面加上 類名@

對象的equals方法默認也是比較了兩個對象的hashcode,兩個對象hashcode不同,自然返回false。

有時我們的業務需求是這樣的:打印對象,即按規則打印對象的所有屬性,兩個對象的所有屬性值相同,則返回兩個對象相等,于是乎我們需要重寫toString函數和equals函數,相信大家都會寫,這里就不再累贅了。

盡管前面寫的User類實現了我們的需求,但會不會也太麻煩了,每個類都需要重寫toString和equals等方法。為了提高開發效率,Kotlin加入了我們馬上要介紹的數據類。

所謂數據類,就是只定義必要的部分,其余部分可以自動生成。

從上面的類可以看出,只有name和age是必須的,其余的都是可以自動推導的。**數據類規定:屬性要通過主構造器指定,而且還要在class關鍵字之前加data。**我們再寫一個數據類,如下:

data class Person(var name: String, val age: Int)
復制代碼

可以看出,原本十幾行幾十行的代碼,現在一行就搞定了,其余的Kotlin編譯器會自動生成。

數據類也和普通類一樣,也可以繼承其他類,有一些其他的成員函數等。

編寫一個數據類需要注意:

  • 主構造器至少要有一個參數;
  • 主構造器的參數要用var或val修飾;
  • 數據類不能是抽象類、open類、封閉類或者內部類。

由于主構造器中必須至少要有一個參數,所以在數據類中,不可能存在無參的主構造器,要想讓數據類擁有一個無參的構造器,有以下兩種方法:

  1. 為主構造器的每一個參數都加上默認值;
  2. 添加一個沒有參數的次構造器,并調用主構造器同時指定各參數。
data class MPerson(var name: String = "js", var age: Int = 20)data class NPerson(var name: String, var age: Int) {// 次構造器,this調用主構造器,并指定參數constructor() : this("js", 20)
}
復制代碼

對象的復制

在開發中,我們經常需要復制一個對象,然后修改它的一部分屬性,這就需要復制機制,Kotlin除了為數據類自動生成toString方法和equals方法,還默認生成了一個copy方法,它的作用就是復制數據類的實例。代碼如下:

var person = Person("wj", 20)
var mCopyPerson1 = person.copy()
var mCopyPerson2 = person.copy(name = "js")
復制代碼

數據類成員的解構

所謂解構,就是解除結構,指的是將數據對象中的屬性提取出來,分別賦給單個變量。

Kotlin編譯器會自動為數據類生成組件函數(以后會說到),因此,可以直接將數據類成員解構:

var js = Person("Js", 20)
// 將js.name和js.age分別賦給name和age變量
var (name, age) = js
println("$name, is $age years old")
復制代碼

封閉類

封閉類可以看作是枚舉的擴展。一個封閉類,前面用sealed關鍵字標識。可以有任意多個子類和對象。封閉類的值只能是這些子類和對象。

使用封閉類的好處是when表達式,不需要再使用else形式了。看個例子:

sealed class Exprdata class Const(var count: Int) : Expr()
data class Sun(var e1: Expr, var e2: Expr) : Expr()fun evel(expr: Expr): Int = when (expr) {is Const -> expr.countis Sun -> evel(expr.e1) + evel(expr.e2)
}
復制代碼

總結

在Kotlin中提供了一些特殊的類,其中數據類和封閉類就是其中的兩個。盡管這些特殊的類并不是必須的,但有些時候使用它們會給我們的開發帶來很大的方便,尤其是數據類。

更多精彩內容,歡迎關注我的微信公眾號——Android機動車

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538754.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

idea前端可視化_jsp可視化開發工具_netbeans jsp可視化_idea 可視化開發 jsp

數字生態鉅惠來襲!秒殺 2核4G 5M帶寬 1200元/3年,1核1G首購 99元/年把默認改成 myeclipse jsp editor()原默認的jsp編輯器是 myeclipse visual jspdesigner,顧名思義,此編譯器是jsp可視化編輯器,對于初學者有很多的幫助…

開博爾智能android播放器,高端安卓播放器的選擇——開博爾Q10Plus 二代 4K高清播放器...

隨著OPPO和三星相繼宣布退出4K藍光播放器市場,先鋒的新機遲遲無法大量鋪貨,現在市面上可選擇的4K播放器就比較少了,價格也很高了,于是很多人開始將注意力轉向了安卓機,其中開博爾是比較有代表性的廠家了,這…

17.類型轉換

自動類型轉換 容量小的數據類型可以自動轉換為容量大的數據類型 byte b 123;//byte b2 300;//報錯,超過了byte最大值127//char c -3;//報錯,char范圍是0~65536,不在范圍char c2 a;//a在ascii碼里是98int i c2;long d01 123213;float f…

docker rabbitmq_一文看懂Rabbitmq,從安裝到實戰演練

Rabbitmq的初步使用隨著微服務概念發展,大應用逐步拆分為小應用,提高開發效率,專門的人做專門的事情,逐漸的流行起來。在微服務上實現通信的方式大部分是采用rpc方式,也有升級版本的grpc。還有另外一種實現就是使用mq來…

Angular v6 正式發布

Angular 6 正式發布 Angular 6 已經正式發布了!這個主要版本并不關注于底層的框架,更多地關注于工具鏈,以及使 Angular 在未來更容易快速推進。 作為發布的一部分,我們同步了主要的框架包 (angular/core, angular/common, angula…

bootstrap五星評分_如何用純代碼實現評分星級顯示?

showRatingStars/*** showRatingStars 顯示評分星級* param {Object} myCanvas 畫布對象* param {Number} rating 評分* param {Number} counts star個數* param {Number} size star大小* param {Object} style star樣式* Example: style {* borderColor:"#21DEEF",…

18.變量

Java是一種強類型語言,每個變量都必須聲明其類型。 Java變量是程序中最基本的存儲單元,其要素包括變量名,變量類型和作用域。 變量在使用前必須對其聲明,只有在變量聲明以后,才能為其分配相應長度的存儲單元。 注意事項…

alertdialog android api 11,android – 設備api級別11的DialogFragments

我設法在兼容包的DialogFragment.java中正確修復了這個問題:改變第74行:boolean mShowsDialog false;注釋掉第232行:// mShowsDialog mContainerId 0;然后將兩個show方法更改為:public void show(FragmentManager manager, Str…

py 字典添加多個value_# Python 3 # Python 3字典Dictionary(1)

Python3 字典字典是另一種可變容器模型,且可存儲任意類型對象。字典的每個鍵值(key>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中 ,格式如下所示:d {key1 : value1, key2 : value2 }鍵必須是唯…

饒軍:Apache Kafka的過去,現在,和未來

歡迎大家前往騰訊云社區,獲取更多騰訊海量技術實踐干貨哦~ 本文首發在云社區,未經許可,不得轉載。大家好,我大概簡單的介紹一下,我叫饒軍,我是硅谷的初創公司Con?uent的聯合創始人之一,我們公司…

機器人 樹莓派 自閉癥_用機器人孩子提高社交能力 讓自閉兒童走出自閉

一項由耶魯大學的研究團隊研究發現,通過讓患有自閉癥譜系障礙(autism spectrum disorders,ASD)的孩童與機器人相處一個月,極大地提高了自閉癥兒童的社交能力。耶魯大學研究中的機器人可以通過眼神接觸和模仿其它社交行為,通過講故事和互動游戲…

19.常量-final

final 常量 final修飾,只能被初始化一次。 public static void main(String[] args){final int a3;a4;//報錯/*TestVariable.java:7: 錯誤: 無法為最終變量a分配值a4;^ 1 個錯誤*/}常量一般用大寫來修飾。 ------------- 更多的Java,Angular,…

Android手機avi轉換為mp4手機,如何把avi轉換為mp4

AVI是目前比較常見的一種音視頻交錯格式,這種格式的文件在多種地方是可以看到的,大多在游戲錄制、光盤文件中可以見到此類文件。其畫質不錯,適合在電腦上觀看,但是現在我們使用較多的是手機、iPad等設備。如果我們想要在這些設備上…

偽代碼書寫規范_C++代碼書寫規范(推薦新手程序員)

代碼就是程序員的面子,無論是在工作中在電腦上寫程序代碼還是在面試時在紙上寫演示代碼我們都希望寫出整潔,優雅的代碼。特別在工作中當我們碰到需要維護別人的代碼,或者是多人參與一個項目大家一起寫代碼的時候,如果碰到一些丑陋…

Java基礎17:Java IO流總結

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/a724888/article/details/80201802 這位大俠,這是我的公眾號:程序員江湖。 分享程序員面試與技術的那些事。 干貨滿滿,關注就送。 本文介…

nuxt頁面跳轉_nuxt 項目如何解決組件復用時頁面不刷新的問題

組件復用會在兩種情況下發生:1、使用 keep-alive 時,頁面再次跳轉時,數據不更新每一次路由的切換都會導致頁面被重新渲染,無論是各種鉤子還是異步獲取數據函數都會被執行,為了提高網站性能,可以使用 keep-a…

20.命名規范

所有變量,方法,類名:見名知意 變量,方法名 --首字母小寫和駝峰原則。 如:run(),getName() 常量 ---大寫字母和下劃線:MAX_VALUE 類名 ---首字母大寫和駝峰原則。 如:Man,HelloWorld ------…

k8s查看pod的yaml文件_K8s-yaml的使用及命令

YAML配置文件管理對象對象管理:# 創建deployment資源kubectl create-f nginx-deployment.yaml# 查看deploymentkubectl get deploy# 查看ReplicaSetkubectl get rs# 查看pods所有標簽kubectl get pods--show-labels# 根據標簽查看podskubectl get pods-l appnginx# …

Orange Business Services 全球發布 Easy Go Network,幫助企業加速實現“網絡即服務”...

100% 數字化, 軟件定義網絡( SDN) 產品在 75 個國家上市 在云、移動化、大數據和物聯網(IoT)趨勢的推動下,企業不斷尋求更加智能和更加靈活的網絡,以支持他們的數字化轉型方案。而網絡只有演進至“網絡即服務”(NaaS&a…

vue的html自動刷新,Vue頁面刷新記住頁面狀態的實現

環境vue項目,頁面有搜索、篩選項等。需求頁面跳轉,切換或者刷新,希望可以記住用戶在頁面的篩選狀態方案v1vue有提供一種緩存組件的解決方案 — keep-alive。緩存不活動的組件實例,而不是銷毀它們。我們可以使用keep-alive包括路由…