J2ME 單類混雜 MIDlet 生命周期、界面邏輯、業務數據,導致代碼難維護、難測試、難復用。引入「MIDlet 作為 Controller、Displayable 子類作為 View」的輕量級分層,能顯著提升結構清晰度。
界面層需從 MIDlet 獲取兩樣東西:
public class TestMIDlet extends MIDlet {
private static TestMIDlet instance;
private LoginForm loginForm; // View 持有引用
public TestMIDlet() { instance = this; }
public void startApp() {
if (loginForm == null) loginForm = new LoginForm(this);
Display.getDisplay(this).setCurrent(loginForm);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
/** 供 View 調用的靜態退出入口 */
public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}
}
public class LoginForm extends Form implements CommandListener {
private Display display; // 若需主動切換畫面
private Command exitCmd = new Command("Exit", Command.EXIT, 1);
public LoginForm(TestMIDlet midlet) {
super("Login");
// 方式一:傳遞 MIDlet 實例,內部調用 midlet.quitApp()
// 方式二:傳遞 Display,此處演示傳 MIDlet
addCommand(exitCmd);
setCommandListener(this);
// 初始化輸入框...
}
public void commandAction(Command c, Displayable d) {
if (c == exitCmd) TestMIDlet.quitApp();
// 其他命令處理...
}
}
隨著畫面增多,建議引入 ScreenManager 單例:
Display 靜態引用。show(Screen)、back()、push/pop 堆疊導航。Displayable 專注單一業務場景,構造器注入依賴(Display、Manager、Service)。Controller 或 Presenter,View 僅負責渲染與事件轉發。paint() 執行耗時操作;異步任務用線程池,完成後 Display.callSerially(() -> repaint()) 刷新。「MIDlet-View 分離」是 J2ME 工程化的第一步。雖不及現代 MVC 框架完備,但以極低開銷換取代碼可讀性、可測試性與團隊協作效率,絕對物超所值。