當我與客戶交談時,我經常聽到一個常見的誤解,那就是關於泛型類型的所有資訊都會從您的 Java 類別檔案中抹去。 這完全是不正確的。 所有靜態泛型資訊都會被保留,只有關於個別實例的泛型資訊才會被抹去。 因此,如果我有一個類別 Foo 實作了 List<String>,那麼我可以確定 Foo 在運行時實作了 List 介面,並由 String 參數化。 但是,如果我在運行時實例化一個 ArrayList<String> 的實例,我無法取得該實例並確定其具體類型參數(我可以確定 ArrayList 需要類型參數)。 在本文中,我將向您展示一些可用泛型元數據的實際用途,這些元數據簡化了策略介面和實作的建立,這些介面和實作因它們處理的物件類型而異。
我在許多應用程式中看到的一種模式是使用某種類型的策略介面,其具體實作各自處理特定的輸入類型。 例如,考慮一個來自投資銀行世界的簡單場景。 任何公開交易的公司都可以發布公司行為,這些行為會對其股票產生實際變化。 其中一個關鍵例子是股息支付,即向所有股東支付每股一定數量的現金、股票或財產。 在投資銀行內部,接收這些事件的通知並計算由此產生的權利非常重要,以便使交易賬簿保持最新,並包含正確的股票和現金價值。
作為一個具體的例子,考慮一下持有 1,200,000 股 IBM 股票的 BigBank。 IBM 決定發布股息,每股支付 0.02 美元。 因此,BigBank 需要收到股息行動的通知,並在適當的時間更新其交易賬簿,以反映額外可用的 24,000 美元現金。
權利的計算會因正在執行的公司行為類型而異。 例如,合併很可能會導致一家公司的股票損失和另一家公司的股票增加。
如果我們考慮一下這在 Java 應用程式中可能如何呈現,我們可以假設看到類似於這個(經過大幅簡化)的例子
public class CorporateActionEventProcessor {
public void onCorporateActionEvent(CorporateActionEvent event) {
// do we have any stock for this security?
// if so calculate our entitlements
}
}
關於事件的通知可能通過來自外部方的多種機制進入,然後發送到這個 CorporateActionEventProcessor 類別。 CorporateActionEvent 介面可能通過多個具體類別實現
public class DividendCorporateActionEvent implements CorporateActionEvent {
private PayoutType payoutType;
private BigDecimal ratioPerShare;
// ...
}
public class MergerCorporateActionEvent implements CorporateActionEvent {
private String currentIsin; // security we currently hold
private String newIsin; // security we get
private BigDecimal…