2014-10-31 42 views
0

嗯,在我的項目中有些東西讓我煩惱。我有很多很多的hibernate實體類,每個類都有自己的DAO(從GenericDAO繼承)。他們大多沒有特定的功能,只是一個繼承GenericDAO的空類。基於反射的基本通用DAO

因爲我認爲那些是不必要的類,所以我決定用反射消除它們。 一些編碼後,我對所有那些沒有特定的方法類的呼叫除了GenericDAO遵循這樣的設計:

DAO.forClass(MyClass.class, MyClassPK.class).genericDAOMethod(); 

它的工作原理就像一個魅力。我現在擺脫了空的DAO。但通過互聯網搜索後,我發現低至沒有像我的解決方案,所以問題是:

這種方法在任何可觀的方式是錯誤還是不好?爲什麼沒有人會考慮這樣做?

+0

你能展示這是如何使用反射嗎?我想,僅僅提到一個班級並不足以稱此爲反思。我認爲你可以在調用端使用GenericDao ,並在你的依賴注入系統中生成這些daos(假設你有一個)。 – 2014-10-31 20:10:00

+0

我的GenericDAO使用Hibernate,所以我只需要實例化一個傳遞MyClass和MyClassPK的新GenericDAO。我在這種DAO中不使用CDI。換句話說,GenericDAO類聲明就像這樣:public class GenericDAO 。 – Dalton 2014-10-31 20:18:37

回答

4

反射幾乎從未被認爲是問題的答案。它很難閱讀,因爲很多人不知道它是什麼,並且後面的人修改你的代碼無法輕易理解。它不是「自我記錄」來使用「代碼完成」一書中的術語。

反射是強大的,因爲你只是發現它在實現一個DAO。但你應該對此感到厭倦。我們在辦公室使用的一個術語是「代碼惡臭」,它可能是出於特定目的而存在的代碼,但除非絕對需要,否則不應在任何地方使用。確保記錄正確,以便那些真正來到你後面的人會知道它到底是什麼。

我喜歡用它在Spring中編寫jUnit測試,以使用反射比較來自兩個不同數據庫的兩個對象。但這是一個測試,實際上並不在生產代碼中。

希望這會有所幫助,並且是你正在尋找的東西!

+0

並不是說你會有兩種不同的方法來使用自己的方法,而不是那些方法。 – Dmytro 2014-10-31 19:59:17

+0

感謝您的回答!正如我所說的,這個類只是爲了繼承而解決了實現空的DAO的問題。在所有其他情況下,我的設計是垃圾。我已經在課堂上記錄下了它......無論如何,你的反思 - 解決問題的觀點是很好的...我會選擇其他觀點並嘗試用良好的文檔來縮小它們。 – Dalton 2014-10-31 20:01:16

+1

@Dmytro它是相同的對象類型,數據庫中有相同的表,因此您使用反射來比較表中的信息。它具有完全相同的信息,相同數量的字段和所有內容。正因爲如此,反射在這裏很有用。 – 2014-10-31 20:05:59