Kotlin 移動和服務器端應用開發 Programming Kotlin Applications: Building Mobile and Server-Side Applications with Kotlin

[美]Brett McLaughlin 譯 任強

買這商品的人也買了...

商品描述

● 如何編寫自己的第一個Kotlin應用
● 如何將Kotlin用作服務器端的解決方案,而不僅僅是編寫移動應用的語言
● Kotlin如何安全地保護用戶信息以及如何編寫安全的應用
● 為什麼Kotlin是Java的優秀替代品,為什麼它是世界上發展最快的編程語言之一

作者簡介

Brett McLaughlin
在技術工作和技術寫作方面擁有超過20年的經驗。
目前,Brett專注於雲計算和企業計算。
他是一名值得信賴的知名人士,能將繁雜的雲概念轉化為清晰的執行層願景從而幫助公司實現雲遷移,尤其是Amazon Web Services。
他的日常工作就是與需要了解雲的關鍵決策者一起,建立並領導開發和運維團隊,帶領他們與不斷變化的雲計算空間進行交互。
他最近領導了NASA的Earth Science計劃和RockCreek Group集團的金融平台的大規模雲遷移。
Brett目前還是電子商務平台提供商Volusion的首席技術官。

目錄大綱

第1章 對象的世界 1
1.1 Kotlin:一門新興的編程語言 1
1.2 什麼是Kotlin 2
1.3 Kotlin是面向對象的語言 3
1.4 設置Kotlin環境 4
1.4.1 安裝Kotlin(及IDE) 4
1.4.2 安裝Kotlin(並使用命令行) 10
1.5 創建有用的對象 12
1.5.1 使用構造函數將值傳遞給對象 13
1.5.2 使用toString ()方法打印對象 14
1.5.3 覆蓋toString ()方法 15
1.5.4 數據並不都是屬性值 17
1.6 初始化對象並更改變量 18
1.6.1 使用代碼塊初始化類 19
1.6.2 Kotlin自動生成getter和setter 20
1.6.3 常量變量不能改變 21
第2章 Kotlin很難出錯 25
2.1 繼續探究Kotlin類 25
2.1.1 根據類命名文件 26
2.1.2 用包管理類 27
2.1.3 將Person類放入包中 28
2.1.4 類:Kotlin的終極類型 31
2.2 Kotlin有很多類型 31
2.2.1 Kotlin中的數字 31
2.2.2 字母和事物 32
2.2.3 真值或假值 33
2.2.4 類型不可互換I 33
2.2.5 屬性必須初始化 34
2.2.6 類型不可互換II 35
2.2.7 Kotlin很容易出錯(某種程度上) 37
2.3 覆蓋屬性訪問器和更改器 38
2.3.1 自定義設置(custom-set)屬性不能位於主構造函數中 38
2.3.2 覆蓋某些屬性的更改器 42
2.4 類可以有自定義行為 44
2.4.1 在類中定義自定義方法 44
2.4.2 每個屬性都必須初始化 45
2.4.3 有時並不需要屬性 48
2.5 類型安全改變一切 50
2.6 代碼的編寫很少是線性的 50
第3章 Kotlin非常優雅 53
3.1 對象、類與Kotlin 53
3.2 所有類都需要equals()方法 54
3.2.1 equals(x)用於比較兩個對象 54
3.2.2 覆蓋equals(x)使其有意義 56
3.2.3 每個對像都是一個特定的類型 58
3.2.4 空值 60
3.3 每個對象實例都需要唯一的hashCode() 61
3.3.1 所有類都繼承自Any類 61
3.3.2 始終覆蓋hashCode()和equals(x) 64
3.3.3 默認哈希值是基於內存位置的 65
3.3.4 使用哈希值生成哈希值 66
3.4 基於有效和快速的equals(x)和hashCode()方法的搜索 67
3.4.1 在hashCode()中區分多個屬性 67
3.4.2 用==代替equals(x) 68
3.4.3 hashCode()的快速檢查 69
3.5 基本的類方法非常重要 70
第4章 繼承很重要 71
4.1 好的類並不總是複雜的類 71
4.1.1 保持簡單、直白 72
4.1.2 保持靈活、直白 73
4.2 類可以定義屬性的默認值 75
4.2.1 構造函數可以接收默認值 76
4.2.2 Kotlin希望參數有序排列 76
4.2.3 按名稱指定參數 77
4.2.4 更改參數順序 77
4.3 次構造函數可以提供額外的構造選項 78
4.3.1 次構造函數排在主構造函數之後 79
4.3.2 次構造函數可給屬性賦值 80
4.3.3 有時,可以將null值賦給屬性 82
4.3.4 null屬性可能會導致問題 85
4.4 使用自定義更改器處理依賴值 85
4.4.1 在自定義更改器中設置依賴值 86
4.4.2 所有屬性賦值都會使用屬性的更改器 86
4.4.3 可為空的值可以設置為空 87
4.4.4 限制對依賴值的訪問 90
4.4.5 盡可能地計算依賴值 91
4.4.6 只讀屬性可不用括號 93
4.5 具體應用——子類 95
4.5.1 Any是所有Kotlin類的基類 96
4.5.2 {...}是折疊代碼的簡略表達 97
4.5.3 類必須是開放的才能有子類 99
4.5.4 術語:子類、繼承、基類等 100
4.5.5 子類必須遵循其父類的規則 100
4.5.6 子類擁有其父類的所有行為 101
4.6 子類應不同於父類 101
4.6.1 子類的構造函數經常添加參數 101
4.6.2 不要讓不可變屬性成為可變屬性 102
4.6.3 有時,對象並不完全映射現實世界 103
4.6.4 通常,對象應當映射現實世界 104
第5章 List、Set和Map 105
5.1 List只是事物的集合 105
5.1.1 Kotlin的List:一種集合類型 105
5.1.2 更改可變列表 109
5.1.3 從可變列表獲取屬性 110
5.2 List(集合)的類型 111
5.2.1 給列表定義類型 111
5.2.2 遍歷列表 113
5.2.3 Kotlin會揣摩你的意思 116
5.3 List:有序且可重複 117
5.3.1 有序可以使你按順序訪問列表項 117
5.3.2 List可以包含重複項 118
5.4 Set:無序但唯一 119
5.4.1 在Set中,無法保證順序 119
5.4.2 何時順序至關重要 120
5.4.3 動態排序List(和Set) 121
5.4.4 Set不允許有重複項 121
5.4.5 迭代器不(總)是可變的 125
5.5 Map:當單值不夠用時 125
5.5.1 Map是由工廠方法創建的 126
5.5.2 使用鍵查找值 126
5.5.3 你希望值是什麼 127
5.6 如何過濾集合 127
5.6.1 基於特定條件的過濾 128
5.6.2 更多有用的過濾器變體 129
5.7 集合:用於基本類型和自定義類型 130
5.7.1 向Person類添加集合 130
5.7.2 允許將集合添加到集合屬性 132
5.7.3 Set和MutableSet不一樣 134
5.7.4 集合屬性只是集合 135
第6章 Kotlin的未來是泛型 137
6.1 泛型允許推遲類型定義 137
6.1.1 集合是泛型的 137
6.1.2 參數化類型在整個類中都可用 138
6.1.3 泛型到底是什麼 139
6.2 泛型會盡可能地推斷類型 140
6.2.1 Kotlin會尋找匹配的類型 140
6.2.2 Kotlin會尋找最精確匹配的類型 141
6.2.3 Kotlin不會告訴你泛型類型 142
6.2.4 告訴Kotlin你想要什麼 143
6.3 協變:類型與賦值的研究 143
6.3.1 什麼是泛型類型 143
6.3.2 有些語言需要額外的工作才能實現協變 145
6.3.3 Kotlin實際上也需要額外的工作才能實現協變 145
6.3.4 有時必須把顯而易見的事情說清楚 146
6.3.5 協變類型限制輸入類型和輸出類型 146
6.3.6 協變實際上是使繼承按期望的方式工作 146
6.4 逆變:從泛型類型構建消費者 147
6.4.1 逆變:限制輸出而不是輸入 147
6.4.2 逆變從基類一直到子類都有效 149
6.4.3 逆變類不能返回泛型類型 150
6.4.4 這些真的重要嗎 150
6.5 UnsafeVariance:學習規則,然後打破規則 151
6.6 類型投影允許你處理基類 152
6.6.1 型變可以影響函數,而不只是類 152
6.6.2 類型投影告知Kotlin可將子類作為基類的輸入 153
6.6.3 生產者不能消費,消費者也不能生產 153
6.6.4 型變不能解決所有問題 154
第7章 控制結構 155
7.1 控制結構是編程的基礎 155
7.2 if和else控制結構 156
7.2.1 !!確保非空值 156
7.2.2 控制結構影響代碼的流程 157
7.2.3 if和else遵循基本結構 158
7.2.4 表達式和if語句 159
7.3 when是Kotlin版本的Switch 163
7.3.1 每個比較或條件都是一個代碼塊 163
7.3.2 用else代碼塊處理其他一切 164
7.3.3 每個分支可以支持一定範圍 165
7.3.4 每個分支通常會有部分錶達式 166
7.3.5 分支條件按順序依次檢查 168
7.3.6 分支條件只是表達式 169
7.3.7 when語句也可作為一個整體來賦值 169
7.4 for循環 171
7.4.1 Kotlin中的for循環需要一個迭代器 171
7.4.2 你做得越少,Kotlin做得越多 172
7.4.3 for對迭代有要求 173
7.4.4 可以用for獲取索引而不是對象 173
7.5 執行while循環直至條件為假 176
7.5.1 while與Boolean條件有關 176
7.5.2 巧用while:多個運算符,一個變量 178
7.5.3 組合控制結構,獲得更有趣的解決方案 179
7.6 do...while循環至少運行一次 180
7.6.1 每個do ... while循環都可以改寫成一個while循環 180
7.6.2 如果必須先執行一定的操作,那麼使用do ... while 181
7.6.3 選用do ... while可能是基於性能的考慮 186
7.7 break可以立即跳出循環 186
7.7.1 break跳過循環中剩餘的部分 186
7.7.2 可以使用帶標籤的break 187
7.8 使用continue立即進入下一次迭代 189
7.8.1 continue也可以使用標籤 189
7.8.2 if和continue對比:通常風格更勝過實質 190
7.9 return語句用於返回 191
第8章 數據類 193
8.1 現實世界中的類是多種多樣,但經過廣泛研究的 193
8.1.1 許多類具有共同的特徵 193
8.1.2 共同的特徵導致共同的用法 195
8.2 數據類是指專注於數據的類 195
8.2.1 數據類提供處理數據的基本功能 195
8.2.2 數據的基本功能包括hashCode()和equals(x)方法 197
8.3 通過解構聲明獲取數據 199
8.3.1 獲取類實例中的屬性值 199
8.3.2 解構聲明並不十分聰明 200
8.3.3 Kotlin使用componentN()方法使聲明生效 201
8.3.4 可以向任何類添加componentN()方法 202
8.3.5 能使用數據類則盡量使用 202
8.4 可以“複製”一個對像或創建一個對象副本 203
8.4.1 使用=實際上不會創建副本 203
8.4.2 使用copy()方法才創建真正的副本 204
8.5 數據類需要你做幾件事 205
8.5.1 數據類需要有參數並指定val或var 205
8.5.2 數據類不能是抽象的、開放的、密封的或內部的 206
8.6 數據類能為生成的代碼添加特殊行為 207
8.6.1 可以覆蓋許多標準方法的編譯器生成版本 207
8.6.2 父類函數優先 208
8.6.3 數據類僅為構造函數參數生成代碼 208
8.6.4 equals()方法僅使用構造函數中的參數 211
8.7 最好單獨使用數據類 212

第9章 枚舉和密封類,以及更多專業類 215
9.1 字符串是可怕的靜態類型表示法 215
9.2 伴生對象為單例 219
9.2.1 常量必須只有一個 220
9.2.2 伴生對像是單例 221
9.2.3 伴生對象仍然是對象 222
9.2.4 可以使用沒有名稱的伴生對象 224
9.3 枚舉定義常量並提供類型安全 228
9.3.1 枚舉類提供類型安全值 229
9.3.2 枚舉類仍然是類 231
9.4 密封類是類型安全的類層次結構 234
9.4.1 枚舉和類層次結構用於共享行為 235
9.4.2 密封類解決了固定選項和非共享行為 236
9.4.3 when需要處理所有密封子類 238

第10章 函數 247
10.1 重溫函數的語法 247
10.1.1 函數基本公式 247
10.1.2 函數參數也有模式 249
10.2 函數遵循靈活規則 257
10.2.1 函數實際上默認返回Unit 258
10.2.2 函數可以是單一表達式 259
10.2.3 函數可以有可變數量的入參 264
10.3 Kotlin的函數具有作用域 267
10.3.1 局部函數是函數內部的函數 267
10.3.2 成員函數在類中定義 268
10.3.3 擴展函數可以擴展現有行為而無須繼承 268
10.4 函數字面量:Lambda和匿名函數 272
10.4.1 匿名函數沒有名稱 273
10.4.2 高階函數接收函數作為入參 276
10.4.3 Lambda表達式是語法精簡的函數 280
10.5 功能越多,出現問題的可能性就越大 285
第11章 編寫地道的Kotlin代碼 287
11.1 作用域函數為代碼提供上下文 287
11.2 使用let提供對實例的即時訪問 288
11.2.1 let提供it來訪問實例 289
11.2.2 作用域代碼塊實際上就是Lambda 290
11.2.3 let和其他作用域函數主要是為了方便 291
11.2.4 鍊式作用域函數和嵌套作用域函數不一樣 294
11.2.5 可以通過作用域函數得到非空結果 297
11.3 with是用於處理實例的作用域函數 304
11.3.1 with使用this作為其對象引用 305
11.3.2 this引用始終可用 306
11.3.3 with返回Lambda的結果 306
11.4 run是一個代碼運行器和作用域函數 307
11.4.1 選擇作用域函數是風格和偏好的問題 307
11.4.2 run不必對對象實例進行操作 309
11.5 apply具有上下文對象但沒有返回值 309
11.5.1 apply對實例進行操作 310
11.5.2 apply返回的是上下文對象,而不是Lambda的結果 310
11.5.3 ?:是Kotlin的Elvis運算符 311
11.6 also在返回實例前先在實例上進行操作 312
11.6.1 also只是又一個作用域函數 313
11.6.2 also在賦值前執行 314
11.7 作用域函數總結 316
第12章 再次體會繼承 321
12.1 抽像類需要延遲實現 321
12.1.1 抽像類無法實例化 322
12.1.2 抽像類定義了與子類的契約 324
12.1.3 抽像類可以定義具體屬性和函數 326
12.1.4 子類履行通過抽像類編寫的契約 328
12.2 接口定義行為但沒有主體 332
12.2.1 接口和抽像類相似 333
12.2.2 接口無法保存狀態 335
12.2.3 接口可以定義函數體 337
12.2.4 接口允許多種實現形式 338
12.3 “委託”為擴展行為提供了另一個選項 341
12.3.1 抽像類從通用到特定 341
12.3.2 更多特異性意味著更多的繼承 343
12.3.3 委託給屬性 346
12.3.4 委託在實例化時發生 348
12.4 繼承需要事前事後深思熟慮 350
第13章 學習Kotlin的下一步 351
13.1 用Kotlin編寫Android應用程序 351
13.1.1 用於Android開發的Kotlin仍然只是Kotlin 351
13.1.2 從概念到示例 353
13.2 Kotlin和Java是很棒的伙伴 353
13.2.1 IDE是一個關鍵組件 353
13.2.2 Kotlin被編譯為Java虛擬機的字節碼 355
13.2.3 使用Gradle構建項目 355
13.3 有關Kotlin的問題仍然存在時 355
13.4 使用互聯網來補充自己的需求和學習風格 356
13.5 接下來怎麼辦 357