使用地图的通用存储库

时间:2014-11-24 15:13:20

标签: java

我有一个功课,指定在现有项目中添加通用存储库层。我面临的问题如下。我的存储库应该封装存储数据的映射。我到现在所拥有的是以下内容:

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构造函数中构造地图。换句话说,我不知道密钥的类型。我希望Person的cnp是键(类型为String),但如果我强制地图将键定义为字符串,我的存储库不再是通用的,因为如果我想要添加一些将键作为整数的Animal对象,地图应该像map = new Map<Integer, T>();

所以问题是我如何仍然使用像Repository<Person> repo = new Repository<Person>();这样的结构,使用存储在存储库中的对象实现IDObject并知道存储库封装存储数据的映射这一事实?我应该如何知道密钥,以便完成存储库类?

1 个答案:

答案 0 :(得分:0)

您必须引入另一种通用类型:

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

之后,您可以将StringIDRepository引入为

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

替代方法是使用Map<Object, O>,但这需要您在Repository类中使用以对象作为参数的getById方法。

希望这会有所帮助!