2010-11-09 82 views
1

這裏的情況:選擇對象動態

我有3個對象的所有命名* *列表和我有一個字符串參數的方法;

gameList = new StringBuffer(); 
    appsList = new StringBuffer(); 
    movieList = new StringBuffer(); 


    public void fetchData(String category) { 
    URL url = null; 
    BufferedReader input; 
    gameList.delete(0, gameList.length()); 

有沒有辦法做到像下面這樣:

public void fetchData(String category) { 
    URL url = null; 
    BufferedReader input; 
    "category"List.delete(0, gameList.length()); 

,所以我可以選擇列表的基於字符串參數一起使用?

+0

目前尚不清楚你想要做什麼,但你爲什麼不能使用Map來做到這一點? – 2010-11-09 14:09:30

+0

快速的上帝。它沒有向我提出我可以使用地圖。非常感謝大家,所有的答案都非常有用! – Andrei 2010-11-09 14:15:47

回答

5

我建議你創建一個HashMap<String, StringBuffer>和使用:

map = new HashMap<String, StringBuffer>(); 
map.put("game", new StringBuffer()); 
map.put("apps", new StringBuffer()); 
map.put("movie", new StringBuffer()); 
... 

public void fetchData(String category) { 
    StringBuffer buffer = map.get(category); 
    if (buffer == null) { 
     // No such category. Throw an exception? 
    } else { 
     // Do whatever you need to 
    } 
} 
+0

@Timothy:*因爲這是Java *,怎麼樣? – 2010-11-09 14:11:34

+0

Bleh!我的壞...我以爲我正在閱讀C#問題 – 2010-11-09 14:13:01

-2

你可以使用一個switch語句

StringBuffer buffer = null; 
switch (category) { 
    case "game": buffer = gameList; 
    case "apps": buffer = appsList; 
    case "movie": buffer = movieList; 
    default: return; 
} 
+0

你應該編輯你的帖子。必須在switch-Block之外創建'StringBuffer緩衝區'。 – 2010-11-09 14:11:03

+0

謝謝,在你的評論之前做了這個:) – robev 2010-11-09 14:11:31

+0

我會反對這一點,因爲將來很難增加新的案例。收集是一條更好的路線。 – 2010-11-09 14:11:33

1

如果名單是你的對象領域 - 是的,使用反射:

Field field = getClass().getDeclaredField(category + "List"); 
List result = field.get(); 

但通常你應該避免反射。如果您的物品是固定的 - 即它們不會更改,則只需使用if-條款。

+0

+1表示他如何做到這一點,即使(如你所說)這是做錯的方法。 – 2010-11-09 14:12:15

0

以給出只會是你的問題的邏輯上最簡單的方法:

StringBuffer which; 
if (category.equals("game")) 
    which=gameList; 
else if (category.equals("apps")) 
    which=appList; 
else if (category.equals("movie")) 
    which=movieList; 
else 
    ... some kind of error handling ... 
which.delete(); 

由於喬恩斯基特指出,如果該列表是大還是動態,你可能想使用的地圖,而不是的if/else /如果。

這就是說,我鼓勵你使用整型常量或枚舉而不是字符串。像:

enum ListType {GAME, APP, MOVIE}; 
void deleteList(ListType category) 
{ 
    if (category==GAME) 
... etc ... 

在這個簡單的例子,如果這是你會永遠做它,它不會有什麼關係。但是我正在研究一個現在使用String標記來處理這種事情的系統,並且它會產生很多問題。

假設您調用該函數,並且錯誤地傳遞了「應用程序」而不是「應用程序」或「遊戲」而不是「遊戲」。或者你可能認爲你昨天爲「歌曲」添加了處理,但實際上你是去吃午飯。這將成功編譯,並且您不會有任何線索,直到運行時纔有問題。如果程序沒有在無效值上拋出錯誤,而是採取一些默認操作,那麼可能有一個難以追蹤的錯誤。但是對於枚舉,如果拼寫錯誤或嘗試使用未定義的名稱,編譯器會立即向您發出錯誤提示。

假設某些功能對這些選項中的某些選項採取特殊操作,而對其他選項不採用其他功能。就像你發現自己寫作

if (category.equals("app")) 
    getSpaceRequirements(); 

和那種事情。然後有人在閱讀該程序時會在這裏看到對「應用程序」的引用,對20行之後的「遊戲」的引用等等。可能難以確定所有可能的值是什麼。任何給定的函數可能都沒有明確地引用它們。但是有了枚舉,它們都整齊地放在一個地方。