對於一個能夠訪問源代碼的經驗豐富的Java開發人員來說,任何程序都可以被看作是博物館裡透明的模型。類似線程轉儲(dump)、方法調用跟蹤、斷點、切面(profiling)統計表等工具可以讓我們了解程序目前正在執行什麼操作、剛才做了什麼操作、未來將做什麼操作。但是在產品環境中情況就沒有那麼明顯了,這些工具一般是不能夠使用的,或最多只能由受過訓練的開發者使用。支持團隊和最終用戶也需要知道在某個時刻應用程序正在執行什麼操作。
為了填補這個空缺,我們已經發明了一些簡單的替代品,例如日志文件(典型情況下用於服務器處理)和狀態條(用於GUI應用程序)。但是,由於這些工具只能捕捉和報告可用信息的一個很小的子集,並且通常必須把這些信息用容易理解的方式表現出來,所以程序員趨向於把它們明確地編寫到應用程序中。而這些代碼會纏繞著應用程序的業務邏輯,當開發者試圖調試或了解核心功能的時候,他們必須"圍繞這些代碼工作",而且還要記得功能發生改變後更新這些代碼。我們希望實現的真正功能是把狀態報告集中在某個位置,把單個狀態消息作為元數據(metadata)來管理。
在本文中我將考慮使用嵌入GUI應用程序中的狀態條組件的情形。我將介紹多種實現這種狀態報告的不同方法,從傳統的硬編碼習慣開始。隨後我會介紹Java 1.5的大量新特性,包括注解(annotation)和運行時字節碼重構(instrumentation)。
狀態管理器(StatusManager)
我的主要目標是建立一個可以嵌入GUI應用程序的JStatusBar Swing組件。圖1顯示了一個簡單的Jframe中狀態條的樣式。
圖1.我們動態生成的狀態條
由於我不希望直接在業務邏輯中引用任何GUI組件,我將建立一個StatusManager(狀態管理器)來充當狀態更新的入口點。實際的通知會被委托給StatusState對象,因此以後可以擴展它以支持多個並發的線程。圖2顯示了這種安排。
圖2. StatusManager和JstatusBar