2014-11-24 102 views
0

我有一项家庭作业,指定将一个通用存储库层添加到现有项目中。我面临的问题是以下几点。我的存储库应该封装一个存储数据的映射。我到目前为止有以下内容:使用映射的通用存储库

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>();这样的构造?我应该如何知道密钥,以便完成存储库类?

+1

“通用存储库层”的真正含义是什么?你怎么想象这种用法?所有存放的对象是否共享唯一的标识符类?如果是,那应该很简单。如果没有,我认为这个任务没有意义。 – Deltharis 2014-11-24 15:28:18

+0

@Deltharis那么,存储库应该有如下方法:'store(T obj)','getAll()'等等。例如,'store(T obj)'方法实际上会生成'map.add(K key,T obj)',并将新存储的对象保存到外部文件中。另外,当您创建存储库时,存储在文件中的所有对象都将加载到地图中。这就是我想象的一部分用法。是的,我所有的存放的对象共享唯一的标识符类。 – cuvidk 2014-11-24 16:11:45

回答

0

你将不得不引入另一个泛型类型:

public class Repository<T, O extends IDObject<T>> 

之后,你可以介绍StringIDRepository作为

public class StringIDRepository<O extends IDObject<String>> extends Repository<String, O> 

选择是使用Map<Object, O>,但这需要你有你的版本库将Object作为参数的类getById方法。

希望这会有所帮助!