Я пытаюсь запрограммировать вид реестра для объектов разных классов.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 идентификатор сделал
BasicObject bo=new BasicObject(...);
innerMap = new SomeMap<Long,BasicObject>();
innerMap.put(42,bo);
registry.put(BasicObject.class,innerMap);
раньше.
Скажите, пожалуйста, если это еще не ясно, мне трудно объяснить, так как английский не мой родной язык.
Заранее спасибо.
Edit:
Оказывается, я могу сделать что-то очень близко к тому, что я хочу, определяя общий класс по карте:
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.
Так утонченный вопрос: Есть ли способ сделать это, без предложения <T extends DbObject>
в главе класса?
Edit 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>
.
Это не о treemap, я мог бы использовать другие виды карт, я знаю. Речь идет о синтаксисе объявления карты. –
@StephanRichter, ответьте обновленно, чтобы ответить на ваш уточненный вопрос. –
Хорошо, это в основном то, что я хотел знать. Я оставлю его открытым в течение нескольких дней, возможно, у кого-то есть лучшая идея/обходное решение/что-то еще. Если нет, я буду отмечать ваш ответ как правильный в следующие дни. Спасибо, до сих пор. –