动态选择对象

时间:2010-11-09 14:03:30

标签: java oop

情况如下:

我有3个对象都名为 * * List,我有一个带String参数的方法;

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

,所以我可以根据String参数选择要使用的列表?

4 个答案:

答案 0 :(得分: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
   }
}

答案 1 :(得分:1)

如果列表是对象的字段 - 是的,使用反射:

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

但通常你应该避免反思。如果您的对象是固定的 - 即它们没有改变,只需使用if - 子句。

答案 2 :(得分: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();

正如Jon Skeet所说,如果列表很大或很动态,你可能想要使用地图而不是if / else / if。

那就是说,我鼓励你使用整数常量或枚举而不是字符串。像:

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

在这个简单的例子中,如果这是你用它做的所有事情,那就不重要了。但我现在正在开发一个系统,它现在使用String令牌来处理这类事情,并且会产生很多问题。

假设您调用该函数并且错误地传入“app”而不是“apps”或“Game”而不是“game”。或者也许你认为你昨天为“歌曲”添加了处理,但实际上你去了午餐。这将成功编译,你不会有任何线索,直到运行时有问题。如果程序没有在无效值上引发错误,而是采取一些默认操作,那么您可能会遇到难以追踪的错误。但是如果您使用枚举,如果您拼写错误名称或尝试使用未定义的名称,编译器会立即提醒您错误。

假设某些功能对其中一些选项采取特殊操作,但对其他选项则不采取特殊措施。就像你发现自己写作

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

等等。然后阅读该程序的人在这里看到对“app”的引用,在20行之后引用“游戏”等等。可能很难确定所有可能的值是什么。任何给定的函数可能都没有明确地引用它们。但是有了枚举,他们整齐地都在一个地方。

答案 3 :(得分:-2)

您可以使用switch语句

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