如何使用不同类型的列表初始化对象?

时间:2011-03-21 11:16:09

标签: java generics

嘿,我正在使用两种不同类型的初始化列表初始化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解决此类问题?

7 个答案:

答案 0 :(得分: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
}

您将拥有一个只接受结果数据的构造函数。这将使得方法将构建的内容更加清晰。

答案 1 :(得分:3)

使用工厂方法

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

答案 2 :(得分:1)

使用工厂方法; e.g。

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;
}

答案 3 :(得分: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
}

答案 4 :(得分: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

答案 5 :(得分: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
}

您可以通过使用接受这两个参数并接受其中任何参数的方法来实现相同的方法,而不是编写方法或构造函数重载。

希望这能解决你的问题。

答案 6 :(得分:0)

这可能有点难看,但是:

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

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