有關 var
,的確 rust 的做法比較好。不過 kotlin 寫到後來就是 val
和 lateinit var
兩種而已。
Java10 要加入 var
,這點另人傷心,現在的規格是:
var str1 = "foo"
final String str2 = "bar"
final
的版本反而很長。應該是倒過來比較理想:
val str1 = "foo"
String str2 = "bar"
也就是鼓勵大家偏 final 的設計
Groovy 和 Scala 都曾挑戰過 Java 的霸權,不過最後的下場都是失敗。其中一項原因就是可讀性比 Java 差。(很奇怪吧?明明是更簡潔的新語言... 但事實就是它們做過頭了)
Kotlin 吸收兩者的教訓,調的剛剛好,讓人愛不釋手。
- Xamarin 是弄給 C# 開發者的
- React Native 是 Front End 開發者才會去寫
- Kotlin 是那些 Android/Java 開發者才有興趣
- Flutter 是 Googler 內部使用
每個跨平台工具都有不同的跨平台的做法,但其實都有強烈的背景在。如果你不是該背景的人,通常不會去選該種特化的工具。
這些工具都各有優缺,但最主要的問題還是市場上人力資源不足,市場上多半還是 native 開發者較多。Mobile 開發者如果決定投入某平台的開發,他/她會投資相關的工具鏈和技能,很難說放棄再學另一套的,尤其是 Mobile 開發現在深似海…
有沒有人學好幾套的?一定有啦,但很多嗎?這位開發者的薪資又會上升到什麼等級?你公司請得起嗎?
integer 最大可到 2^53 ,拿來放 unix epoch timestamp 可以放到 5000 年,夠了。時間這個欄位規格和 parser 一直很混亂,時區也難搞,所以我個人最後通通退化成 epoch milli-second 了。
最上層只能是
{}
或[]
到是第一次注意到,所以單單寫"foo"
這樣不算個 JSON。JSON 格式很簡單,但難用的是不能寫 comment,還有不允許結尾多個 comma:
{
"foo":"bar",
}
不接受結尾 comma 很煩
這個情境真的很難重現,主要是要讓 thread 夠忙來不及更新資料才會發生 ...
就算只是單純的把 System.out 移到外面來,也會影響執行結果:
public class VolatileTest {
private static volatile int MY_INT = 0;
public static void main(String[] args) {
new ChangeListener().start();
new ChangeMaker().start();
}
static class ChangeListener extends Thread {
@Override
public void run() {
int local_value = MY_INT;
while ( local_value < 5){
if( local_value!= MY_INT){
//LOGGER.log(Level.INFO,"Got Change for MY_INT : {0}", MY_INT);
//System.out.println("Got Change for MY_INT : " + MY_INT);
local_value= MY_INT;
}
//原本是 local_value != MY_INT 才會印出 Got Change ...
System.out.println("Got Change for MY_INT : " + MY_INT);
}
}
}
static class ChangeMaker extends Thread{
@Override
public void run() {
int local_value = MY_INT;
while (MY_INT <5){
//LOGGER.log(Level.INFO, "Incrementing MY_INT to {0}", local_value+1);
System.out.println("Incrementing MY_INT to " + (local_value+1));
MY_INT = ++local_value;
try {
Thread.sleep(500);
} catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
}