J2ME 官方基於 CLDC 1.1/MIDP 2.0,不支援 JDK 1.5 語法特性(泛型、自動拆裝箱、增強 for 循環等)。但開發階段若能享受這些語法糖,可大幅提升代碼質量與開發效率。
| 特性 | JDK 1.5 寫法 | JDK 1.4 寫法 |
|---|---|---|
| 泛型 | Vector | Vector v = new Vector(); v.add("A"); String b = (String)v.elementAt(0); |
| 自動拆裝箱 | Integer a = 1; Integer b = 2; System.out.println(a + b); | Integer a = new Integer(1); Integer b = new Integer(2); System.out.println(a.intValue() + b.intValue()); |
JDK 1.5 編譯器將 "a" + i + "b" 優化為 StringBuilder,但 CLDC 無 StringBuilder(只有 StringBuffer)。
規避:源碼中統一使用 StringBuffer 手動拼接,禁用 + 連接非字面量。
Integer.valueOf(int) 調用CLDC 1.1 的 java.lang.Integer 無 valueOf(int) 靜態方法(J2SE 有)。
規避:源碼中顯式寫 new Integer(i),避免編譯器生成不存在的方法調用。
<?xml version="1.0"?>
<project name="project" default="build" basedir=".">
<property name="wtk.home" value="C:\WTK25"/>
<property name="wtk.midp.version" value="1.0"/>
<property name="wtk.cldc.version" value="1.0"/>
<taskdef resource="antenna.properties" classpath="D:\eclipse\antenna.jar"/>
<property name="jar.name" value="Test"/>
<target name="build">
<!-- 編譯:不指定 source/target,保留 1.5 class 格式 -->
<javac srcdir="src" destdir="classes"
classpath="${wtk.home}\lib\cldcapi10.jar;${wtk.home}\lib\midpapi10.jar"/>
<!-- 打包 -->
<jar destfile="${jar.name}.jar" basedir="classes"/>
<!-- 預驗證 -->
<wtkpreverify jarfile="${jar.name}.jar"/>
<!-- 打入資源文件 -->
<exec executable="jar.exe">
<arg line="-uf ${jar.name}.jar -C res ."/>
</exec>
</target>
</project>
java.util.concurrent、StringBuilder、Enum 等):不可用今日視角看,這是「編譯期語法降級」的早期實踐。現代構建工具鏈可用:
但「開發時現代語法、運行時舊版本 VM」的工程化思想始終有效。