情况如下:
我有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参数选择要使用的列表?
答案 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;
}