「動有動的好處,靜有靜的好處。」強類型靜態語言 Java 與動態語言(Ruby、Python、JavaScript)各有優勢。盲目追隨大師潮流投奔動態陣營,或固守靜態教條拒絕變革,皆非上策。本文探討如何在 Java 生態中引入動態特性,尋找規範與靈活的平衡點。
| 維度 | Java (強類型靜態) | 動態語言 (Ruby/JS/Python) |
|---|---|---|
| 類型系統 | 編譯期檢查,運行期擦除 | 運行期動態綁定,鴨子類型 |
| 代碼風格 | 規範統一,「正楷字」 | 個性化強,「草書體」 |
| 大型專案維護 | 優勢明顯:重構安全、介面契約清晰 | 挑戰大:依賴測試覆蓋、文檔同步 |
| 小型/腳本任務 | 樣板代碼多,啟動慢 | 輕量敏捷,REPL 驅動開發 |
| 企業級能力 | 多線程、分布式事務、高併發成熟 | 受限於 GIL/運行時架構,難以企及 |
動態語言能做的,Java 透過框架/語言演進(Groovy、Lambda、反射、MethodHandle)大多能實現;但 Java 能做的(多核並行、兩階段提交、高吞吐服務端),動態語言若要達到同等級別,勢必引入靜態機制,本質上已非純動態。
在保持 Java 企業級優勢的前提下,針對開發痛點引入動態特性:
傳統 Struts Action 強制簽名:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
EasyJWeb AbstractCmdAction 支援 16 種方法簽名 自動識別:
// 返回 Page 或 void
public Page doCreate(WebForm form, Module module)
public Page doCreate(WebForm form)
public Page doCreate(Module module)
public Page doCreate()
public void doCreate(WebForm form, Module module)
public void doCreate(WebForm form)
public void doCreate(Module module)
public void doCreate()
// 方法名可省略 do 前綴
public Page create(WebForm form, Module module)
public void create() // 等同以上
調用方式多樣化:
xxx.ejf?easyJWebCommand=createxxx.ejf?cmd=create/ejf/xxx/create (REST 風格)收益:代碼簡潔、易測試(無需容器即可單元測試)、適應不同業務場景參數需求。
使用註解聲明驗證規則,支援自然語言參數:
@FormPO(name = "person", validators = {
@Validator(name = "required", field = "name,sex,height,birthDate"),
@Validator(name = "range", field = "birthDate",
value = "min:1908-01-01;max:2008-01-01")
})
public class Person { /* getter/setter */ }
RangeValidator 無需指定目標類型,自動適配 Integer、BigDecimal、Date 等所有可比較類型:
@Validator(name = "range", field = "salary",
value = "min:3000;max:50000;min_msg:薪資不能低於3000;max_msg:薪資超出上限")
支援多種命名慣例:min_msg/max_msg 或 minMsg/maxMsg。
forward()、go() 方法支援多種參數組合,適應不同調用場景。
| 階段 | 技術/特性 | 動態化程度 |
|---|---|---|
| JDK 1.1 | 反射 | 運行期檢視/調用,但語法繁瑣 |
| JDK 5 | 註解、泛型 | 元數據驅動,減少樣板代碼 |
| JDK 6 | Scripting API (JSR-223) | 內嵌 JavaScript/Ruby/Python 引擎 |
| JDK 7 | invokedynamic、MethodHandle | JVM 級動態調用支撐 |
| JDK 8 | Lambda、Stream、Optional | 函數式風格,行為參數化 |
| Groovy/Kotlin | JVM 動態/靜態混合語言 | 無縫互操作,語法級動態特性 |
| Spring Boot | 自動配置、條件裝配 | 約定優於配置,運行期決策 |
Java 不需也不應變成動態語言。真正的智慧在於在靜態骨架上植入動態關節:核心業務邏輯享受類型安全與重構優勢,邊緣適配層(Web 控制器、配置驗證、規則引擎、腳本整合)吸收動態特性靈活應變。EasyJWeb 的實踐證明:找到這個「黃金分割點」,讓 Java 開發者既能享受企業級穩固,又能體驗「想動就動」的輕快感。