學Kotlin其實要看:http://kotlinlang.org/docs/kotlin docs.pdf 線上版是不完整的!!!少了一些章節,會有點難看懂後面的文檔。 我選擇了WordPress里的錯誤消息管理類wp error.php為對象,沒有依賴其他具體場景和類,所以比較適合移植和對比。 ...
學Kotlin其實要看:http://kotlinlang.org/docs/kotlin-docs.pdf
線上版是不完整的!!!少了一些章節,會有點難看懂後面的文檔。
我選擇了WordPress里的錯誤消息管理類wp-error.php為對象,沒有依賴其他具體場景和類,所以比較適合移植和對比。
代碼是前幾天整理的,為了便於線上查看,把它貼到Git上了。代碼查看地址:http://git.oschina.net/web3d/kotpress/blob/master/Error.kt
為了簡化邏輯,將Error類中要保存的data、code全部設定為String類型。
基礎知識
1.語感
上帝說,要有光,從此就有光了;奧巴馬說,編程語言是門外語,從此,我們也是精通多種外語的人了。
Kotlin從代碼的語感上,是有著python的風格的,像:
if (obj is String) return obj.length
if (x in 1..y - 1) println("OK")
是不是很接近英文原生語句?
2.變數
局部變數分為可變變數和不變變數,分別用 var(variable) 和 val(?)來聲明。
variable
記憶體中的變數初始化,一般要經過兩步,聲明變數類型、開闢記憶體空間;賦值初始化。
var y: Int;
y = 10;
目前多數語言的寫法,都是一句話完成這兩步。
var y: Int = 10;
而Kotlin中更簡潔的寫法是:
var y = 10;
y 被賦值時,會被自動推斷(inferred)為整型Int,這種寫法有點親切感了。
註:類型自動推斷是強靜態類型語言範圍的一種特性。自動推斷類型的能力讓很多編程任務變得容易,讓程式員可以忽略類型標註的同時仍然允許類型檢查。類型推導不是Go語言首創,但是現代語言中,Go中運用廣泛,Kotlin也引入了這種特性。
Kotlin是靜態類型的,如果想將y重新賦值為其它類型如字元串是不行的:
y = “13"
Val
val 基本特性和用法與var相同,但有點類似我們一般語言中常量的概念:被初始化賦值一次後,不能再重新賦值;與常量不同的是,它可以作為局部變數。如:
val y = 10
如果繼續在後面:
y = 12
編譯器就會報錯。
當然,不能重新賦值不是說變數所代表的對象包含的值不能變,下文的數組對象array,同樣是通過val聲明的,但它裡面包含的值是可以繼續操作的。
剛從PHP轉過來的話,應該還有點適應不了:要熟悉和記憶各種數據類型和集合類型;每次聲明一個變數,還要想這個變數是否可變,太燒腦了。但這就是一種更朴實的思維方式,前面多想想,後面的代碼就會更可靠,不會因為一些意外的操作造成數據的值或類型被破壞。
類的普通屬性應該都用 var 來聲明,因為可能要在某個方法中將另一個對象賦給它;但局部變數應當儘可能用val。
3.類型推導
Java裡面定義一個字元串類型的一維數組列表要這樣寫:
ArrayList<String> array = new ArrayList<String>();
Kotlin裡面:
Kotlin可與Java互通,所以,它也可以寫成類似上面的形式:
val array: ArrayList<String> = ArrayList<String>();//沒有new關鍵詞
array.add(“abc")
但Kotlin風格的寫法為:
val array = arrayListOf<String>();
array.add(“abc")
PHP裡面:
$array = [];
$array[] = ‘abc';
4.this
和Java一樣,Kotlin中大多數時候,this可以省略,這是現代編程語言都支持的特性。
像PHP、Python這種都需要有個指代對象去訪問。
5.empty/Blank
再牛掰的語言,可能也解決不了空字元串的問題;一個字元串對象就是可以包含空字元串、或者可能含有多個空格的字元串。但邏輯上,他們是無效的數據!所以幾乎每個有字元串的地方,可能都要判斷一下,尤其是做鍵名等名稱標識的場景。
WordPress這個Error類就是典型場景。錯誤消息是按錯誤代碼 => 錯誤消息 的格式存儲的,如果以空字元串為鍵名,它到底代表什麼含義,無法明確得知。所以我們就要判斷是否為empty,但php里的empty判斷在這真正有用嗎,如果這個鍵名里包含的字元全是空格呢?所以像Java和Kotlin中的String對象除了isEmtpy()方法外都會有個isBlank()的判斷。
但在演示代碼中,我反覆斟酌後,還是去掉了相關判斷,因為幾乎這個類每個方法里都得加,這樣沒有美感,不科學。
6.句尾分號可省略
單行語句多數情況可以省略分號
7.燒腦的Exception
PHP中,我們還沒有養成拋出異常、然後捕捉異常的編程習慣。一般都是通過多種返回值類型或範圍去判斷結果,是成功還是失敗、正常還是異常。到了Kotlin這類靜態類型語言中,方法返回值也是需要一種確定的類型,那麼失敗或異常就只能通過拋出異常的方式去做了。異常的捕捉如果不到位的話,就很容易出現不健壯的體驗,動不動的崩潰了。