簡介
這個準則以設計 JavaBeans 和設計師的各種選擇為重點。
如需 JavaBeans 的相關資訊,請參閱概念:JavaBeans。
JavaBean 內容
基本上,內容值可以儲存為私密欄位,但也可以計算。設計師可以選擇預先計算內容的值,或使用惰性求值,只有在呼叫端請求時才會計算值。
設計師也可以選擇界限或限制內容。如果內容是界限或限制,則設計師必須決定事件和通知機制。
事件與通知
對於通知機制的實作,設計師有兩種作法:
-
使用 java.beans 套件的 PropertyChangeSupport 和 PropertyChangeEvent 類別。
-
建立自訂的通知機制
java.beans 套件的類別提供適合大多數情況的實作。PropertyChangeEvent 包含激發事件的物件參照、String 內容的名稱及代表內容新舊值的兩個物件。類別
PropertyChangeSupport 維護一組 PropertyChangeListeners,且在 firePropertyChange 方法中包含通知程式碼。
PropertyChangeSupport 常用於構成使用者介面的 JavaBeans。
需要避免花時間建立事件物件時,自訂通知可能較為合適。缺點是實作人員必須實作通知機制。自訂通知的實作人員必須注意不同的執行緒可能會在通知過程中增加或移除接聽器。為了提供正確的行為,大多數解決方案會建立集合複本來保留接聽器;然後以此複本來執行通知。大多數已發佈的實作會在通知流程一開始就建立這個複本,導致出現許多翻版和降低效能。不過,因為通知比新增或移除接聽器更常發生,在新增或移除接聽器期間,可以事先建立一個持久的複本,然後重複用於通知,執行速度會更快。
考慮到開發人員的生產力,應該只在 java.beans 套件的內容變更支援確實達到效能瓶頸時,才嘗試採取自訂通知。
下列範例示範 java.beans 套件的內容變更支援及自訂通知機制的用法。
範例:使用 java.beans.PropertyChangeSupport 的 Tank JavaBean
我們在這裡有一個代表 Tank 的 JavaBean,具有一個界限內容:level。當 Tank 的水位改變時,Tank 會激發
PropertyChangeEvent,由 TankController 物件來處理。
範例:使用自訂通知的 Tank Java Bean
在下列範例中,類別 Tank 以一種自訂的、更有效率的通知機制來實作,在通知期間可避免建立物件。
|