1

以下代码不起作用(当然),因为标记的行无法编译:

MyClass {
    //singleton stuff
    private static MyClass instance;
    private MyClass () {}
    public static MyClass getInstance() {
        if(instance==null) {
            instance = new MyClass ();
        }
        return instance;
    }

    // method creating problems
    public NonGenericSuperClassOfGenericClass create(Class<?>... classes) {
        if(someCondition)
             return new GenericClass<classes[0],classes[1]>; // DOES NOT COMPILE
        else
             return new OtherGenericClass<classes[0]>;
    }
}

因此,我实际上不知道“创建”是否会返回

GenericClass<classes[0],classes[1]>

或者

OtherGenericClass<classes[0]>

有不同数量的参数。

发生这种情况是因为我正在使用Spring并且我打算使用MongoDB,但将来我可能需要切换到不同的东西(例如 Hibernate)。

类 GenericClass 类似于:

 GenericClass<PersistetType1, Long> 

或者

 GenericClass<PersistentType2, Long>

其中 PersistentType1/2 是我最终需要存储在数据库中的类,而 GenericClass 是一种访问 Mongo API 的代理。事实上,它看起来像:

  public MongoTemplate getTemplate();
  public void save(T toInsert);
  public List<T> select(Query selectionQuery);
  public T selectById(ID id);
  public WriteResult update(Query selectionQuery, Update updatedAttributes);
  public void delete(T toRemove);
  public void delete(Query selectionQuery);

怎么办?从控制器(或实体,如果你很挑剔)我需要实例化存储库并调用任何方法。这导致控制器与 MongoDB 耦合,即它们必须显式实例化这样的 GenericClass,它实际上称为 MongoRepository 并且严格依赖于 Mongo(实际上它是一个具有恰好两个“自由度”的泛型)。

所以,我决定创建 MyClass,这是一个隔离控制器的进一步代理。这样,Controller 可以获取 MyClass 的单个实例,并让它创建相应存储库的新实例。特别是,当“somecondition”为真时,意味着我们要使用MongoRepository(当它为假时,可能需要实例化一个Hibernate代理,即HibernateRepository)。但是,MongoRepository 是通用的,因此它需要某种形式的实例化,我希望将其作为参数传递。

不幸的是,泛型是在编译时解决的,因此我猜它们对我不起作用。

我该如何解决?

4

1 回答 1

2

为了将底层持久性存储与应用程序逻辑分离,我将使用 DAO 方法。

使用所需的方法定义 DAO 的接口,例如保存、更新等。然后为您可能需要的每个持久性提供程序提供一个实现,例如 UserAccess 可能是您可以实现为 HibernateUserAccess 和 MongoUserAccess 的接口。在每个实现中,您注入适当的模板,例如 Mongo 或 Hibernate,并使用它来完成持久化操作。

您可能遇到的问题是您的加载操作将返回一个用户实例,这需要因持久性提供程序而异,即 JPA 注释将不同于 MongoDB 所需的 Spring Data 注释(泄漏抽象)。

我可能会通过创建一个用户界面来表示持久性操作的结果并为每个持久性提供者提供一个实现来解决这个问题。要么返回,要么返回您从 JPA 或 Mongo 加载的结果构建的通用模型。

于 2012-06-30T11:57:17.830 回答