2014-11-24 97 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方法。

希望這會有所幫助!