2014-11-24 4 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>();하지만 문제는 저장소 생성자에서지도를 작성하는 방법을 모른다는 것입니다. 즉, 키의 유형을 알지 못합니다. 사람의 cnp을 키 (Type은 String)로 지정하고 싶지만 키를 String으로 정의하도록 맵을 강제로 설정하면 키가있는 일부 Animal 객체를 추가하려는 경우 저장소가 더 이상 일반화되지 않습니다. 정수로, 맵은 map = new Map<Integer, T>();과 같아야합니다.

따라서 질문은 어떻게 저장소가 IDObject을 구현하고 데이터를 저장하는지도를 캡슐화한다는 사실을 알고 있다는 사실을 이용하여 Repository<Person> repo = new Repository<Person>();과 같은 구조를 사용할 수 있습니까? 저장소 클래스를 완성 할 수 있도록 키를 어떻게 알 수 있습니까?

+1

"일반 리포지토리 계층"은 실제로 무엇을 의미합니까? 그 사용법을 어떻게 상상합니까? 기탁 된 모든 객체가 고유 식별자 클래스를 공유합니까? 그렇다면 단순해야합니다. 그렇지 않다면 나는 그 일이 의미가 있다고 생각하지 않는다. – Deltharis

+0

@Deltharis 글쎄, 저장소에는'store (T obj)','getAll()'등의 메소드가 있어야합니다. 예를 들어,'store (T obj)'메쏘드는'map.add (K key, T obj)'를 실제로 생성 할 것이고 또한 새로 저장된 객체를 extern 파일에 저장할 것입니다. 또한 저장소를 만들 때 파일에 저장된 모든 개체가지도에로드됩니다. 그것이 사용법의 일부분을 상상하는 방법입니다. 네, 모든 기탁 된 객체는 고유 식별자 클래스를 공유합니다. – cuvidk

답변

0

당신은 다른 제네릭 형식 소개 할 것이다 : 당신이

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

대안이 Map<Object, O>을 사용하는 것입니다으로 StringIDRepository을 소개 할 수 그 후

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

을,하지만 당신의 저장소에있는 당신을 필요로 Object를 인수로서 취하는 getById 클래스의 메소드

희망이 도움이 될 것입니다!