我與客戶交談時經常聽到一種普遍的誤解,認為 Java 類檔案中的所有泛型資訊都會被擦除。這完全是錯誤的。所有靜態泛型資訊都會被保留,只有關於單個例項的泛型資訊會被擦除。所以,如果我有一個實現 List<String> 的類 Foo,那麼我可以在執行時確定 Foo 實現的是以 String 為引數的 List 介面。但是,如果我在執行時例項化一個 ArrayList<String> 的例項,我無法透過該例項來確定其具體的型別引數(但我可以確定 ArrayList 需要型別引數)。在這篇文章中,我將向您展示一些可用的泛型元資料的一個實際用途,這些元資料可以簡化策略介面和實現(根據它們處理的物件型別而有所不同)的建立。
我在許多應用程式中看到的一種模式是使用某種策略介面,其具體實現分別處理特定的輸入型別。例如,考慮投資銀行業務中的一個簡單場景。任何上市公司都可以釋出公司行為,從而導致其股票發生實際變化。一個主要例子是股息支付,它按每股向所有股東支付一定數量的現金、股票或財產。在投資銀行內部,接收這些事件的通知並計算由此產生的權益非常重要,以便使交易賬簿與正確的股票和現金價值保持同步。
作為一個具體示例,考慮 BigBank 持有 1,200,000 股 IBM 股票。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…