2014-11-24 2 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<Person> repo = new Repository<Person>(); Но проблема в том, что я не знаю, как построить карту в конструкторе репозитория. Другими словами, я не знаю тип ключа. Я хочу, чтобы Person's cnp был ключом (который относится к типу String), но если я заставляю карту определять ключи как строки, мой репозиторий больше не является общим, потому что если я хочу добавить некоторые объекты Animal, у которых есть ключ как целое число, карта должна быть равна map = new Map<Integer, T>();.

Итак, вопрос в том, как я могу использовать конструкцию типа Repository<Person> repo = new Repository<Person>();, используя тот факт, что объекты, которые хранятся в репозитории, реализуют IDObject и зная, что репозиторий инкапсулирует карту, в которой хранятся данные? Как мне узнать ключ, чтобы закончить класс репозитория?

+1

Что означает «общий слой репозитория»? Как вы представляете себе использование? Будут ли все ваши депонированные объекты иметь уникальный класс идентификаторов? Если да, это должно быть просто. Если нет, я не думаю, что задача имеет смысл. – Deltharis

+0

@ Deltharis Ну, в репозитории должны быть такие методы, как: 'store (T obj)', 'getAll()' и т. Д. Например, метод 'store (T obj)' фактически сделает 'map.add (K key, T obj)' и сохранит вновь сохраненный объект в файл extern. Также при создании репозитория все объекты, хранящиеся в файле, будут загружены на карту. Вот как я себе представляю часть использования. И да, все мои депонированные объекты имеют уникальный класс идентификаторов. – cuvidk

ответ

0

Вам придется ввести еще один общий тип:

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

После этого вы можете ввести StringIDRepository в

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

Альтернатива заключается в использовании Map<Object, O>, но это потребует от вас есть в вашем хранилище класса getById, который принимает объект как аргумент.

Надеюсь, это поможет!

Смежные вопросы