Java 早期受硬體限制引入 8 種原語與包裝類,自動裝箱緩解不一致。下一代語言徹底消除差異:
groovy:000> 1.class // → class java.lang.Integer groovy:000> 1e12.class // → class java.math.BigDecimal
常數即物件,支援元編程(如為數字添加方法構建 DSL:3.cm)。自動處理數值上變換防溢位。
所有類型均可呼叫方法,自動容量轉換。提供型別提示優化熱點:(defn sum [^float x] ...) 生成更高效代碼。
2.toString== 正確比較值(原語與物件通用),eq/ne 比較引用核心優勢:將低級細節卸載給語言/運行時,開發者專注高層問題。
Java Person 類需構造器、getter/setter、toString 等樣板代碼。Scala 三行搞定:
class Person(val name: String, var age: Int) {
override def toString = name + " is " + age + " years old."
}
val = 不可變屬性 + getter,var = 可變屬性 + getter/setter,構造器自動生成。
class UpperVerbose {
def upper(strings: String*) : Seq[String] = strings.map((s:String) => s.toUpperCase())
}
object Up {
def upper(strings: String*) = strings.map(_.toUpperCase())
}
Object 替代靜態方法,返回類型推斷、單行方法省略大括號、佔位符 _ 簡化 Lambda。
val bob = Person("Bob", 42)(無需 new)val(不可變)equals/hashCode/toStringcopy() 支援不可變變體修改class Person {
private name
def age
def getName() { name }
String toString() { "${name} is ${age} years old." }
}
def bob = new Person(name: "Bob", age: 42)
println(bob.name) // 實際呼叫 getName()
def 字段自動生成 getter/setter,可單獨覆寫。@EqualsAndHashCode 註解(AST 轉換)自動生成 equals/hashCode。
傳統用映射(鍵值對)持有資料:(def mario {:fname "Mario" :age "18"}),存取 (:age mario)。
(def hal {:fname "hal" :address {:city "Boston"}})
(:city (:address hal)) // 內外評估
(-> hal :address :city) // Thread 宏反轉,更自然
(defrecord Person [fname lname address]) (defrecord Address [street city state]) (def don (->Person "Don" "Gately" (->Address "Ennet House" "Boston" "MA"))) (-> don :address :city)
Clojure 1.2+ 提供工廠函數 ->Type、map->Type。Record 優勢:生成 Java 類(利於多方法)、支援欄位驗證、固定鍵集下速度更快。配合協議構建代碼(未來介紹)。
三語言皆提供遠優於 Java 的便捷語法:Groovy/Scala 簡化類建構,Clojure 讓映射/記錄/類無縫互操作。核心主題:消除不必要的樣板代碼。下期續探討異常處理等主題。