【问题标题】:data access object pattern with abstract factories, creation over generic types具有抽象工厂的数据访问对象模式,基于泛型类型的创建
【发布时间】:2014-10-31 09:52:35
【问题描述】:

我正在为安卓设备开发一个数据库应用程序。 我需要做的第一件事是创建数据访问层。 为此,我想将 DAO 模式与抽象工厂一起使用。

对于所有 DAO,我有一个接口,其中包含所有数据对象需要实现的声明。 (在我的例子中:IDataObject)
具体的 DAO 都由自己的接口表示,扩展了所有 DAO 的基本接口。

基础接口:

public interface IDataObject {

  public IDataId getId();

  public void write() throws MyDataWriteException;

  public void validate() throws MyDataValidException;
}

一个扩展:

public interface IDataSample1 extends IDataObject {

  public void setNotice(String notice);
  public String getNotice();

  public void setDate(Date date);
  public Date getDate();

}

要创建一个数据对象,我想使用抽象来使用抽象工厂,例如:

public interface IDataFactory<Template extends IDataObject> {

  public List<Template> getAll();

  public Template get(IDataId id);

  public List<Template> getList(DataAccessArgument arg);

  public List<Template> getList(List<DataAccessArgument> argList);
}

和实施:

public class DataSample1Fac implements IDataFactory<IDataSample1> {

  public DataSample1Fac () {
  }

  public List<IDataSample1> getAll() {
    return null;
  }

  public IDataSample1 get(IDataId id) {
    return null;
  }

  public List<IDataSample1> getList(DataAccessArgument arg) {
    return null;
  }

  public List<IDataSample1> getList(List<DataAccessArgument> argList) {
    return null;
  }

}

到目前为止我没有收到任何错误,但现在我想实现一个工厂构建器:

public class DataFactoryBuilder {

  private DataFactoryBuilder() {
  }

  public static<T extends IDataObject> IDataFactory<T> getFactory(){    

    if (T instanceof IDataSample1)
      return new DataSample1Fac();
    return null;

  }

}

我收到以下错误(第 8 行):

T cannot be resolved to a variable

和(第 9 行)

Type mismatch: cannot convert from DataSample1Fac to IDataFactory<T>

不知道如何解决这个问题,有什么建议吗?

【问题讨论】:

  • 我试过了: public static IDataFactory getFactory(Class type){ if (T == IDataSample1.class) return new DataSample1Fac();返回空值; } 但我得到了同样的错误
  • T 只是关于类型的信息。它本身不是一个对象,所以你不能在它上面调用方法。

标签: java android dao factory


【解决方案1】:

我会将您的 DataFactoryBuilder 重构为类似的东西:

class DataFactoryBuilder {

    private DataFactoryBuilder() {
    }

    public static IDataFactory<? extends IDataObject> getFactory(Class<? extends IDataObject> clazz){    

        if (IDataSample1.class.isAssignableFrom(clazz)) {
            return new DataSample1Fac();
        }
        return null;
    }
}

【讨论】:

  • 这非常接近我的需要,谢谢。创建 fac 时出现以下错误:无法从 capture#1-of 转换?将 IDataObject 扩展到 IDataSample1
  • 你是怎么得到这个错误的?像这样 DataSample1Fac fac = DataFactoryBuilder.getFactory(IDataSample1.class);?你应该使用 IDataFactory> fac = DataFactoryBuilder.getFactory(IDataSample1.class);
  • 这不是问题。当我调用 fac.get() 时,我得到了这个错误。
【解决方案2】:

我得到了以下解决方案:

public static <T extends IDataObject> IDataFactory<T> getFactory(Class<T> type) {
    if (IDataSample1.class.isAssignableFrom(type)) {
      DataSample1Facfac = new DataSample1Fac();
      return (IDataFactory<T>) fac;
    }
}

但我收到警告:return (IDataFactory) fac;

Type safety: Unchecked cast from DataSample1Fac to IDataFactory<T>

我认为这不是问题,我只需要抑制它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多