我有一项家庭作业,指定将一个通用存储库层添加到现有项目中。我面临的问题是以下几点。我的存储库应该封装一个存储数据的映射。我到目前为止有以下内容:使用映射的通用存储库
public interface IDObject<T> {
public Comparable<T> getID();
}
public class Person implements IDObject<String> {
private String cnp;
private String name;
private String age;
public Person(String cnp, String name, String age) {
this.cnp = cnp;
this.name = name;
this.age = age;
}
public void setName(String name) { this.name = name; }
public void setCNP(String cnp) { this.cnp = cnp; }
public void setAge(String age) { this.age = age; }
public String getName() { return name; }
public String getCNP() { return cnp; }
public String getAge() {return age; }
public String toString() { return cnp + "-" + name + "-" + age; }
@Override
public Comparable<String> getID() { return getCNP(); } //basically the unique identifier
}
public class Repository<T extends IDObject<?????????>>{
private IMap map;
public Repository() {
map = new Map<???????, T>();
}
...
}
所以我的问题出现在Repository类中。我想存储人员,所以我会做类似Repository<Person> repo = new Repository<Person>();
但问题是我不知道如何在Repository构造函数中构造映射。换句话说,我不知道密钥的类型。我希望人的cnp
是关键字(类型String
),但是如果我强制地图将键定义为字符串,我的存储库不再是通用的,因为如果我想添加一些具有关键字的动物对象作为一个整数,地图应该像map = new Map<Integer, T>();
。
所以问题是如何使用存储在存储库中的对象实现IDObject
并知道存储库封装存储数据的映射的事实,仍然可以使用像Repository<Person> repo = new Repository<Person>();
这样的构造?我应该如何知道密钥,以便完成存储库类?
“通用存储库层”的真正含义是什么?你怎么想象这种用法?所有存放的对象是否共享唯一的标识符类?如果是,那应该很简单。如果没有,我认为这个任务没有意义。 – Deltharis 2014-11-24 15:28:18
@Deltharis那么,存储库应该有如下方法:'store(T obj)','getAll()'等等。例如,'store(T obj)'方法实际上会生成'map.add(K key,T obj)',并将新存储的对象保存到外部文件中。另外,当您创建存储库时,存储在文件中的所有对象都将加载到地图中。这就是我想象的一部分用法。是的,我所有的存放的对象共享唯一的标识符类。 – cuvidk 2014-11-24 16:11:45