2010-11-09 2 views
1

Voici la situation:Sélectionner l'objet dynamique

J'ai 3 tous les objets nommés * * Liste et j'ai une méthode avec un paramètre de chaîne;

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


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

Est-il possible de faire quelque chose comme ce qui suit:

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

, donc je peux choisir parmi les listes à utiliser en fonction du paramètre de chaîne?

+0

Il n'est pas clair sur ce que vous essayez de faire mais pourquoi ne pouvez-vous pas utiliser Map pour cela? –

+0

Dieu qui était rapide. Il ne m'est pas venu à l'esprit que je pouvais utiliser une carte.Merci à tous, toutes les réponses sont vraiment utiles !!! – Andrei

Répondre

5

Je vous suggère de créer un HashMap<String, StringBuffer> et l'utiliser:

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: Que diriez-vous de * parce que c'est Java *? –

+0

Bleh! mon mauvais ... je pensais que je lisais des questions C# –

-2

Vous pouvez utiliser une instruction switch

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

Vous devriez éditer votre poste. 'StringBuffer buffer' doit être créé en dehors du switch-Block. –

+0

Merci, l'a fait avant votre commentaire :) – robev

+0

Je voudrais argumenter contre cela, car il serait difficile d'ajouter de nouveaux cas dans le futur. Une collection est un meilleur itinéraire. –

1

Si les listes sont des champs de votre objet - oui, en utilisant la réflexion:

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

Mais généralement vous devriez éviter la réflexion. Et si vos objets sont fixes, c'est-à-dire qu'ils ne changent pas, utilisez simplement une clause if.

+0

+1 pour montrer comment il pouvait le faire, même si (comme vous l'avez dit) c'est la mauvaise façon de le faire. –

0

La logique la plus simple façon de prendre votre question donnée serait juste:

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(); 

Comme Jon Skeet a noté, si la liste est grande ou vous dynamique voulez probablement utiliser une carte plutôt qu'un if/else/si. Cela dit, je vous encourage à utiliser une constante entière ou une énumération plutôt qu'une chaîne. Comme:

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

Dans cet exemple simple, si c'est tout ce que vous pourriez faire avec, cela n'aurait pas beaucoup d'importance. Mais je travaille actuellement sur un système qui utilise des jetons String pour ce genre de chose partout, et cela crée beaucoup de problèmes.

Supposons que vous appeliez la fonction et que vous passiez par erreur dans "app" au lieu de "apps", ou "Game" au lieu de "game". Ou peut-être que vous pensez que vous avez ajouté la manipulation pour "chanson" hier, mais en fait vous êtes allé déjeuner à la place. Cela sera compilé avec succès, et vous n'aurez aucune idée qu'il y a un problème avant l'exécution. Si le programme ne lance pas d'erreur sur une valeur non valide mais prend une action par défaut, vous pourriez avoir un bug difficile à localiser. Mais avec une énumération, si vous épelez mal le nom ou essayez d'en utiliser un qui n'est pas défini, le compilateur vous avertira immédiatement de l'erreur. Supposons que certaines fonctions prennent des mesures spéciales pour certaines de ces options mais pas pour d'autres. Comme vous vous trouvez à écrire

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

et ce genre de chose. Alors quelqu'un lisant le programme voit une référence à "app" ici, une référence à "jeu" 20 lignes plus tard, etc. Il pourrait être difficile de déterminer quelles sont toutes les valeurs possibles. Une fonction donnée peut ne pas les référencer explicitement tous. Mais avec une énumération, ils sont tous parfaitement au même endroit.

Questions connexes