首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 內部類實戰:控制框架與溫室自動化系統

     編輯:Java 相關知識

為什麼需要內部類?

應用框架要求「將變化的東西與不變的東西分離」。控制框架是事件驅動系統的核心:

  • 不變:事件調度、時間檢查、列表管理(Controller、EventSet)
  • 變化:具體事件動作(開燈、關水、響鈴、重啟)

內部類完美封裝「變化部分」,且能直接訪問外部類所有成員(含 private),無需傳遞上下文對象。

核心框架代碼

// Event 抽象類:時間觸發 + 動作 + 描述
abstract class Event {
    long evtTime;
    Event(long t) { evtTime = t; }
    boolean ready() { return System.currentTimeMillis() >= evtTime; }
    abstract void action();
    abstract String description();
}

// Controller:事件列表 + 調度循環
class Controller {
    EventSet es = new EventSet();
    void addEvent(Event c) { es.add(c); }
    void run() {
        Event e;
        while ((e = es.getNext()) != null) {
            if (e.ready()) { e.action(); println(e.description()); es.removeCurrent(); }
        }
    }
}

溫室控制系統:完整內部類應用

public class GreenhouseControls extends Controller {
    private boolean light = false, water = false;
    private String thermostat = "Day";

    // 內部類封裝各具體事件,直接訪問外部字段
    private class LightOn extends Event { ... action() { light = true; } }
    private class LightOff extends Event { ... action() { light = false; } }
    private class WaterOn extends Event { ... }
    private class ThermostatNight extends Event { ... }
    // Bell:自重新排程事件
    private class Bell extends Event {
        void action() {
            println("Bing!");
            if (--rings > 0) addEvent(new Bell(now + 2000));
        }
    }
    // Restart:一次性裝配全套事件循環
    private class Restart extends Event {
        void action() {
            long tm = System.currentTimeMillis();
            rings = 5;
            addEvent(new ThermostatNight(tm));
            addEvent(new LightOn(tm + 1000));
            // ... 更多事件 ...
            addEvent(new Restart(tm + 20000)); // 循環重啟
        }
    }

    public static void main(String[] args) {
        GreenhouseControls gc = new GreenhouseControls();
        gc.addEvent(gc.new Restart(System.currentTimeMillis()));
        gc.run();
    }
}

內部類的關鍵優勢

  1. 完全封裝:每個事件類 private,實現細節對外不可見,可安全重構。
  2. 零傳遞訪問外部狀態:light、water、thermostat、rings 直接讀寫,代碼極簡潔。
  3. 類似多重繼承效果:Bell 同時擁有 Event 接口與 GreenhouseControls 所有成員。
  4. 動態自我排程:Bell、Restart 在 action() 中 addEvent(this) 實現循環/重啟。

總結

內部類讓控制框架「單類實現、多事件解耦」成為可能。Java 1.1 AWT 事件模型同樣依賴此機制。第 13 章將展示內部類在 GUI 編程中的更大威力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved