Overview
本節(jié)介紹如何在四種語言中聲明變量和常量。
Java 篇
變量
語法
數(shù)據(jù)類型 變量名 = 變量值;
例
String variable = "foo";
常量
在變量前加上關(guān)鍵字 final 就可以將變量聲明為常量
例
final String constant = "foo";
Groovy 篇
變量
靜態(tài)類型變量
聲明方式與 Java 完全一致,但是 Groovy 不要求類型基本一致,只要等式右邊的值能夠向等式左邊變量的類型進行轉(zhuǎn)換那么變量的賦值仍舊成立
// 第二行報錯,因為 10 無法轉(zhuǎn)換為 Date 類型
Date date = new Date()
date = 10
// 正常運行,因為 Date 對象可以通過 toString() 方法轉(zhuǎn)換為 String 類型
String str = "10"
str = new Date()
以上代碼實際會被編譯成如下的 Java 代碼
Date date = (Date)ScriptBytecodeAdapter.castToType(var1[1].callConstructor(Date.class), Date.class);
String str = "10";
Object var6 = var1[2].callConstructor(Date.class);
str = (String)ShortTypeHandling.castToString(var6);
var1[3].callStatic(App.class, str);
可以看到第二個例子雖然在源代碼層面上只使用變量 str,但是在編譯后實際使用了 str, var6 兩個變量。
動態(tài)類型變量
語法
def 變量名 = 變量值
例
def foo = "foo"
動態(tài)類型可以自由變換值和變量類型
常量
Groovy 定義常量的方式與 Java 相同,但是目前的 v2.4.x 版本還是存在歷史遺留問題,常量實際上仍然可以被任意修改
例:
final String constant = "foo"
constant = 10
實際第二行的語句仍然可以正常執(zhí)行
String constant = "foo";
以上是上述例子的編譯結(jié)果,可以看到 final 關(guān)鍵字在編譯后被完全丟棄了,目前這個 Bug 官方聲稱已經(jīng)在 2.5.0-beta-1 版本修復(fù)了,具體情況可以查看 https://issues.apache.org/jira/browse/GROOVY-1628 和 https://issues.apache.org/jira/browse/GROOVY-2752 兩個 issue。
Scala 篇
變量
語法
var 變量名: 變量類型 = 變量值
例
var variable: String = "foo"
常量(值)
在官方術(shù)語中, Scala 中的常量被實際被稱為值
語法
val 值名: 值類型 = 具體值
例
val constant = "foo"
簡便方式
在 Scala 中,無論是聲明變量還是值時都可以直接省略類型說明
例
var variable = "foo"
val constant = "foo"
這種聲明方式看起來像 Groovy 聲明動態(tài)類型。但實際上 Scala 是比 Java 更強的靜態(tài)類型語言,只是 Scala 更智能,如果你不明確指定類型的話,Scala 會通過等式右邊的值來推斷其數(shù)據(jù)類型,任何試圖改變數(shù)據(jù)類型的行為都會報錯。
Kotlin 篇
Kotlin 在使用時與 Scala 一致,這里就省略了。
Summary
- Groovy 聲明方式類似 Java,但是支持聲明動態(tài)類型;Scala 與 Kotlin 聲明方法一樣,都是將類型放在名稱后面。
- 雖然四種語言都支持值不變的特性,但目前 Groovy 版本存在著 Bug
文章源碼見 https://github.com/SidneyXu/JGSK 倉庫的 _06_variable 小節(jié)