在与客户交谈时,我经常听到一个误解,即所有关于泛型类型的信息都会从您的 Java 类文件中擦除。这完全是错误的。所有静态泛型信息都会保留,只有单个实例的泛型信息会被擦除。因此,如果我有一个类Foo,它实现了List<String>,那么我可以在运行时确定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…