2011-03-21 66 views
5

嗨,我正在用兩種不同類型的初始化列表初始化ListRepository。最好的方法是這樣的。如何用不同類型的列表初始化一個對象?

public ListRepository(String id, List<PrimaryKey> initilizationList) 
{ 
    // Load objects from data source via primary key. 
} 

public ListRepository(String id, List<DomainObject> initilizationList) 
{ 
    // Store objects directly 
} 

不幸的是,由於運行時類型的擦除,這是不可能的。我不喜歡使用List<?>作爲參數的構造函數方法,這會導致對第一個條目的一個醜陋的instanceof檢查,以確定列表類型並處理它。

如何用直觀,乾淨的API解決這樣的問題?

回答

4

的構造是做遠遠超過初始化的對象。最好讓構造器簡單。

我會使用靜態方法來執行每個查詢。

public static ListRepository<PrimaryKey> loadFromPrimaryKey(String id, List<PrimaryKey> initilizationList) { 
    // Load objects from data source via primary key. 
} 

public static ListRepository<PrimaryKey> loadFromDomainObject(String id, List<DomainObject> initilizationList) { 
    // Store objects directly 
} 

你將有一個構造函數,它只是產生的數據。這將使得這些方法將構建得更加清晰。

3

使用工廠方法

class ListRepository {  
    public static ListRepository createPrimaryKeysRepository(String id, List<PrimaryKey> initilizationList){} 
    public static ListRepository createDomainObjectsRepository(String id, List<DomainObject> initilizationList){} 
} 
0

你可以換列表中的對象包含列表:

public ListRepository(String id, PrimaryKeyList initilizationList) 
{ 
    // Load objects from data source via primary key. 
} 

public ListRepository(String id, DomainObjectList initilizationList) 
{ 
    // Store objects directly 
} 

,或者你可以只用一個方法,並傳遞一個額外的參數,是一個布爾值或枚舉:

public ListRepository(String id, List<?> initilizationList initilizationList, boolean isPrimaryKey) 
{ 
    // Load objects from data source 
} 
1

使用工廠方法;例如

private ListRepository(String id) { 
    this.id = id; 
} 

public static ListRepository createFromPrimaryKeys(String id, List<PrimaryKey> init) { 
    ListRepository res = new ListRepository(id); 
    // Load objects from data source via primary key. 
    return res; 
} 

public static ListRepository createFromObjects(String id, List<DomainObject> init) { 
    ListRepository res = new ListRepository(id); 
    // Store objects directly 
    return res; 
} 
0

  
public ListRepository(String id, PrimaryKey...keys) { 
    // Load objects from data source via primary key. 
} 

public ListRepository(String id, DomainObject...stuff) 
{ 
    // Store objects directly 
} 

,或者如何使用專門ListRepositoryInitializers

0
public ListRepository(String id, List<PrimaryKey> listByKey , List<DomainObject> listByObject) 
{ 
    if(listByKey == null) 
    // Load objects from data source via primary key. 
    else 
    // Store Objects Directly 
} 

而不是寫的方法或構造函數重載的,您可以用它接受兩個參數的方法實現相同,採取任何一個。

希望這會解決您的問題。

0

這可能是一個有點難看,但怎麼樣:

public ListRepository(String id, PrimaryKey[] initilizationList) { 
    [...] 
} 

public ListRepository(String id, DomainObject[] initilizationList) { 
    [...] 
} 

烏。

相關問題