2009-04-08 18 views
1

所以可以說我有,它存儲在數據庫中的對象:最好的方法,從「簡單的類名稱」轉換成「完整類名」在Java對象

com.test.dummy.Cat 

貓有一個整數ID 。

我的「世界」之外的參照對象是形式的字符串:

的Cat-433

其中433是分配數據庫ID的貓。

當我得到傳遞給我的字符串時,我需要能夠在數據庫中找到它。

所以我這樣做:

String[] splitString = str.split("-"); 
String objectType = splitString[0]; 
Integer id = Integer.valueOf(splitString[1]); 

我的問題是:什麼是從com.test.dummy.Cat,所以我可以做的Class.forName,以獲得最佳方式()在字符串和在數據庫中找到該對象?

我在想某種XML映射或硬編碼的純java映射。我有什麼選擇?

回答

2

如果您已經知道您將要從數據庫中讀取Cat,爲什麼您的Cat表的DAO不會被編碼爲創建一個新的Cat(),然後用您讀取的值填充它?

你將有一個工廠,將返回一個「DatabaseObject」的方法getDatabaseObject(字符串參考),將拆分「Cat-433」的名稱,使用第一部分來決定調用哪個DAO和第二部分作爲DAO的DatabaseObject get(int uid);方法中的UID傳入。

2

一張地圖,像HashMap。它可以用代碼設置,或者可以使用幾個類中的任何一個從文件中讀取對(例如,在Spring中)。

但從更大的圖片來看,您的計劃是脆弱的。你必須解析一個字符串,你必須假設你永遠不會在另一個同名的包含類中使用一個類,等等。

你可能需要重新思考你在做什麼,或者發佈你的目標 ,而不是你的實現,作爲一個問題。從OP

評論:

但因爲我會控制從SimpleName到類名的映射,將真正成爲一個問題? - cloutierm(2分鐘前)

在一個非常簡單的玩具的應用程序,這威力工作。在真實應用程序中,您會發現您使用的庫類具有相同的簡單名稱。

或者換句話說,通過這樣做,你會說:「我永遠不會使用Spring clasess或Apache Commons類甚至java.lang類,而不必通過代碼來查找名稱衝突。 「這是爲了避免這樣的不可避免的類,包裝設計。

+0

同意 - 不存儲包名稱會導致問題 – 2009-04-08 14:25:23

+0

但因爲我會從SimpleName控制映射到ClassName,這真的會是一個問題嗎? – systemoutprintln 2009-04-08 14:26:54

+0

這取決於你想如何設置你的映射。你暗示你會使用類名作爲關鍵字,如果有多個具有該名稱的類,這當然會失敗。如果你不這樣做,那麼第二個Cat類將有一個Cat2密鑰(例如),這是可能的。 – Robin 2009-04-08 14:47:58

1

假設你的類型在運行時被讀入,你可以自動填充映射表,即

public class Cat { 
... 
    static { 
    mapping.put("Cat", "xyz.Cat"); 
    } 
... 
} 
相關問題