我正在构建一条FIX消息,在典型情况下将构建如下:
Message message = new News();
message.setField(new SenderCompID("me"));
message.setField(new TargetCompID("you"));
...
message.setField(new BookSubType("whatever"));
输入是一个哈希映射:
HashMap<String, String> hmap = new HashMap<String, String>();
hmap.put("SenderCompID", "me");
hmap.put("TargetCompID", "you");
…
hmap.put("BookSubType", "whatever");
从此输入构造消息的一种方法是:
String senderCompID = hmap.get("SenderCompID");
if (senderCompID != null && !senderCompID.equals("")) {
message.setField(new SenderCompID(senderCompID));
}
…
对于每个领域都是如此。 但是有太多的领域,我最终会花几天时间写这篇文章。如果我可以使用hmap键动态创建对象,那将会很方便。到目前为止,我最好的尝试是:
for (Map.Entry<String, String> entry : hmap.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
Class c = Class.forName(key);
Constructor con = c.getConstructor(SenderCompID.getClass());
Object xyz = con.newInstance(value);
if (xyz instanceof SenderCompID) {
message.setField((SenderCompID) xyz);
} else if ( xyz instanceof TargetCompID ) {
message.setField((TargetCompID) xyz);
} else if …
}
有没有办法摆脱“if else”陈述?我要转换的类存储在String(key)中,我不能以某种方式使用地图中的键来强制转换它吗?
答案 0 :(得分:0)
您可以使用Map
Class
作为键,然后使用Class<T>::cast
功能删除if-else
子句:
final Map<Class<? extends MyBaseClass>, String> map = new HashMap<Class<? extends MyBaseClass>, String>();
map.put(SenderCompID.class, "me"); // SenderCompID, TargetCompID are all subclasses of MyBaseClass
// ....
for (Map.Entry<Class<? extends MyBaseClass>, String> entry : hmap.entrySet()) {
Class<? extends MyBaseClass> klass = entry.getKey();
// your operations ...
message.setField(klass.cast(xyz));
}