雖增加代碼量與複雜度,但為了可維護性與擴展性,主流 J2ME 專案均採用 MIDlet 與 UI 分離架構。核心交互內容僅兩項:Display 物件傳遞與退出處理委託。
package testmidlet;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class TestMIDlet extends MIDlet {
private static TestMIDlet instance;
private LoginForm displayable;
private Display display;
public TestMIDlet() {
instance = this;
display = Display.getDisplay(this);
displayable = new LoginForm(display); // 構造時注入 Display
}
public void startApp() { display.setCurrent(displayable); }
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
// 靜態退出入口,供 UI 呼叫
public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}
}
package testmidlet;
import javax.microedition.lcdui.*;
public class LoginForm extends Form implements CommandListener {
private Display display;
public LoginForm(Display display) {
super("Test");
this.display = display;
setCommandListener(this);
addCommand(new Command("Exit", Command.EXIT, 1));
}
public void commandAction(Command command, Displayable displayable) {
if (command.getCommandType() == Command.EXIT) {
TestMIDlet.quitApp(); // 委託 MIDlet 退出
}
}
}
Display 由 MIDlet 建構子取得並傳遞給 UI 建構子,避免 UI 靜態存取 Display.getDisplay(midlet) 產生耦合。quitApp(),UI 僅呼叫靜態方法,不直接操作 MIDlet 生命週期 API。instance 讓靜態方法能存取 MIDlet 實例;銷毀時置 null 釋放引用。Displayable,MIDlet 僅負責 setCurrent() 切換,UI 之間無直接依賴。此模式清晰劃分「控制器」與「視圖」職責,是 J2ME 專案邁向 MVC 架構的基石步驟。