我想为不同类的对象编程一种注册表。以类为关键的TreeMap
我有以下几点:
public interface DbObject{
void setId(long id);
Long getId();
}
实现此接口的原型类将是以下几点:
public class BasicDbObject implements DbObject{
private long id=null;
void setId(long id){
this.id=id;
}
Long getId(){
return id;
}
}
我想建立这个界面的各种不同的实现。 我希望能够拥有一个Map对象,它可以从每个实现类映射到一个Map实例。
事情是这样的:
Map <Class<C implements DbObject> , Map<Long, C>> registry = new TreeMap/HashMap/SomeOtherKindOfMap (...)
我知道我可以做这样的事情
Map <String,Map<Long,DbObjects>> registry = new ...
但这种方式我会多写一些代码来确定名称,比较类等。有没有更简单的方法来实现这一点?
所以我想知道的是:是否有可能将类对象作为树形图中的键?
声明一个映射对象的语法是什么?映射从实现类C到映射对象从长对象(id)映射到C的实例?
我希望能够做的请求如下所示:
BasicObject bo = registry.get(BasicObject.class).get(42);
assuing ID以前那样
BasicObject bo=new BasicObject(...);
innerMap = new SomeMap<Long,BasicObject>();
innerMap.put(42,bo);
registry.put(BasicObject.class,innerMap);
。
请告诉我,如果这还不清楚,我很难解释,因为英语不是我的母语。
预先感谢您。
编辑:
事实证明,我可以做一些非常接近我想要的东西,周围的地图定义泛型类时:
public class ObjectRegistry <T extends DbObject>{
private HashMap<Class<T>, TreeMap<Long,T>> registry=null;
ObjectRegistry(){
registry=new HashMap<Class<T>, TreeMap<Long,T>>();
}
public void register(T dbObject){
TreeMap<Long, T> map = registry.get(dbObject.getClass());
if (map==null){
map=new TreeMap<Long,T>();
registry.put((Class<T>) dbObject.getClass(),map);
}
map.put(dbObject.getId(),dbObject);
}
public <T extends DbObject>T get(Class<T> objectClass,long id){
TreeMap<Long, T> map = (TreeMap<Long, T>) registry.get(objectClass);
if (map != null){
return map.get(id);
}
return null;
}
public TreeMap<Long,T> getAll(Class<T> dbObjectClass) {
return registry.get(dbObjectClass);
}
}
我用一个TreeMap的内部映射,因为我想轻松地返回按id排序的Class实例。
因此,精炼的问题是: 有没有办法做到这一点,没有类头的<T extends DbObject>
子句?
编辑2:
通过它又在想,事实证明,约翰的回答是完全解决了这个。
这是我的最终代码:
HashMap<Class<? extends DbObject>, TreeMap<Long, ? extends DbObject>> registry = null;
public <T extends DbObject> T get(Class<T> clazz, long id) {
TreeMap<Long, T> map = (TreeMap<Long, T>) registry.get(clazz);
if (map != null) {
return map.get(id);
}
return null;
}
public <T extends DbObject> void register(T dbObject) {
TreeMap<Long, T> map = (TreeMap<Long, T>) registry.get(dbObject.getClass());
if (map == null) {
map = new TreeMap<Long, T>();
registry.put((Class<T>) dbObject.getClass(), map);
}
map.put(dbObject.getId(), dbObject);
}
public <T extends DbObject> TreeMap<Long, T> getAll(Class<T> dbObjectClass) {
return (TreeMap<Long, T>) registry.get(dbObjectClass);
}
它不需要在类头<T extends DbObject>
条款。
这不是关于树图,我可以使用其他类型的地图,我知道。这是关于声明地图的语法。 –
@StephanRichter,回答更新以解决您澄清的问题。 –
好的,那基本上是我想知道的。我会让它开放一些日子,也许有人有一个更好的想法/解决方法/无论。如果没有,我会在接下来的日子里将你的答案标记为正确。谢谢,到目前为止。 –