kotlin 學習感受
直白的說。。很不好,像屎一樣,本來對此抱有很大的期望和好感度,但經過一整天的學習,完全失望了,這門語言中間有各種的奇怪的語法和反直覺性的東西
特點
優點
在jvm的基礎上特別在安全性做了很大的改進。。很多的特性基本杜絕了一些不安全的編碼,並且做了類似 RASP 的安全方案。
官方也宣傳說對Java 100%兼容.
先說優點吧,免得說我在胡亂噴shit
控制流語句變得很靈活支持默認返回,和label 控制等特性
比如when和if 變得極其靈活而且方便好用例如
var par = when(i){
i is null -> false
i is String -> {
do some ....
null #last will auto return to var par
}
i in 1..100 -> {
do some ...
i * 2
}else{
null
}
}
加入了 extension 的特性
例如Java的 Array
fun Array<Int>.swap(first:Int,last:Int){
var f_i = this[first]
this[first] = this[last]
this[last] = f_i
}
// this will get [0,1,2,3,4]
var s = Array<Int>(5,{i-> i})
s.swap(2,4) /// will swap
屎一樣的缺點
我試着寫了一個JSwing 呵呵。但是失敗了。官方加了一個 kotlin-swing。。 呵呵
繁雜的語法糖
fun <T> cloneWhenGreater(list: List<T>, threshold: T): List<T>
where T : Comparable,
T : Cloneable {
return list.filter { it > threshold }.map { it.clone() }
}
比如原來的 @Override 變成需要特別申明原來的類為open class,這導致了一個很重大的問題。。目前寫的類以后到底要不要用呢?假如沒有寫open的話。。那么其他人如果想要重寫某個方法,就沒有辦法
及其臃腫的結構
真的不是我想黑他。
在為了安全性的考慮上,它在普通class 的基礎上加了 一個 open的結構
所有想要繼承的類必須加上open ,這導致我不知道怎么繼承原始的類比如 Int
還有諸如data ,object ,interface, abstract 這樣單獨的東西。和原來Java 簡介明了的class 和 interface 有着很大差別。。如果不是認真記憶,很容易把這些混雜
為了增加所謂好的特性加入了非常多的語法
比如generics,為了防止溢出或者 UnMatchClass 這樣的錯誤,特別又(ps:TMD到底還有多少語法)加了 T
in
out
等語法
fun get(index: Int): T { /* ... */ }
...
fun copy(from: Array<out Any>, to: Array<Any>) {
// ...
}
同時混入了類似 Object-c中的delegation的東西。。。。。
總結
整體沒有設計哲學,就像一個胡亂的七巧板一樣有各種形狀的單個模塊(我個人偏向類似Lisp的語系),為了加入好的特性而像拼湊積木一樣加入各種語法,大大加大了學習的成本和編寫的成本。最后在使用的時候往往出現各種問題;和Java的兼容性並不如宣傳說的那么好。