下面的代碼無法正常工作(當然),這是因爲標線不編譯:春+蒙戈+泛型+靈活性
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]>
具有不同的參數數目。
這是因爲我使用春天,我打算使用MongoDB的,但在未來我可能需要切換到不同的東西(例如休眠)。
類GenericClass是一樣的東西:
GenericClass<PersistetType1, Long>
或
GenericClass<PersistentType2, Long>
其中PersistentType1/2,我需要最後在DB存儲類,而,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是通用的,因此它需要某種形式的實例化,我希望作爲參數傳遞。
不幸的是,泛型在編譯時被解析,因此它們不適合我,我想。
我該如何解決這個問題?
當然,這是一個解決方案,但它需要我爲每個持久實體實現一個DAO。我不想這麼做,因爲它需要付出很多努力,而提供持久性的可能性相當低。我寧願讓我的20/25實體與MongoDB結合在一起,並在不改變提供商的情況下賭博。 – Manu
我會那麼做。更改持久性提供程序不是經常發生的事情。無論如何,涉及更新25個實體的努力並不是那麼好。 –