Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态选择对象_Java_Oop - Fatal编程技术网

Java 动态选择对象

Java 动态选择对象,java,oop,Java,Oop,情况如下: 我有3个对象都命名为**列表,我有一个带字符串参数的方法 gameList = new StringBuffer(); appsList = new StringBuffer(); movieList = new StringBuffer(); public void fetchData(String category) { URL url = null; BufferedReader input; gameList.delete(0, gameL

情况如下:

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

,因此我可以根据字符串参数选择要使用的列表?

我建议您创建一个
HashMap
并使用它:

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
   }
}
map=newhashmap();
map.put(“游戏”,新的StringBuffer());
put(“apps”,new StringBuffer());
map.put(“电影”,新的StringBuffer());
...
公共数据(字符串类别){
StringBuffer=map.get(类别);
if(buffer==null){
//没有此类类别。是否引发异常?
}否则{
//做你需要做的一切
}
}

我建议您创建一个
HashMap
并使用它:

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
   }
}
map=newhashmap();
map.put(“游戏”,新的StringBuffer());
put(“apps”,new StringBuffer());
map.put(“电影”,新的StringBuffer());
...
公共数据(字符串类别){
StringBuffer=map.get(类别);
if(buffer==null){
//没有此类类别。是否引发异常?
}否则{
//做你需要做的一切
}
}

您可以使用switch语句

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

您可以使用switch语句

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

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

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

但一般来说,你应该避免反思。如果您的对象是固定的,即它们不改变,只需使用
if
-子句。

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

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

但一般来说,你应该避免反思。如果你的对象是固定的,也就是说,它们不会改变,只需使用
if
-子句。

逻辑上最简单的回答问题的方法就是:

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 ...
在这个简单的例子中,如果这就是你用它所做的一切,那就没什么大不了的了。但是我现在正在开发一个系统,它在所有地方都使用字符串标记,这会产生很多问题

假设您调用该函数,并且错误地将“app”而不是“apps”传入,或者将“Game”而不是“Game”传入。或者你可能认为你昨天增加了“歌曲”的处理,但事实上你去吃午饭了。这将成功编译,直到运行时,您才知道有问题。如果程序没有在无效值上抛出错误,而是采取了一些默认操作,则可能存在难以跟踪的错误。但对于枚举,如果您拼写错误或试图使用未定义的名称,编译器将立即向您发出错误警报

假设某些函数对其中一些选项采取特殊操作,但对其他选项不采取特殊操作。就像你发现自己在写作一样

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

诸如此类的事情。然后,有人在阅读该程序时,会在此处看到对“app”的引用,20行之后会看到对“game”的引用,等等。可能很难确定所有可能的值是什么。任何给定的函数都可能不会显式引用它们。但对于枚举,它们都整齐地放在一个地方。

逻辑上最简单的回答问题的方法是:

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 ...
在这个简单的例子中,如果这就是你用它所做的一切,那就没什么大不了的了。但是我现在正在开发一个系统,它在所有地方都使用字符串标记,这会产生很多问题

假设您调用该函数,并且错误地将“app”而不是“apps”传入,或者将“Game”而不是“Game”传入。或者你可能认为你昨天增加了“歌曲”的处理,但事实上你去吃午饭了。这将成功编译,直到运行时,您才知道有问题。如果程序没有在无效值上抛出错误,而是采取了一些默认操作,则可能存在难以跟踪的错误。但对于枚举,如果您拼写错误或试图使用未定义的名称,编译器将立即向您发出错误警报

假设某些函数对其中一些选项采取特殊操作,但对其他选项不采取特殊操作。就像你发现自己在写作一样

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

诸如此类的事情。然后,有人在阅读该程序时,会在此处看到对“app”的引用,20行之后会看到对“game”的引用,等等。可能很难确定所有可能的值是什么。任何给定的函数都可能不会显式引用它们。但是有了一个枚举,它们都整齐地放在一个地方。

不清楚你们想做什么,但为什么你们不能用地图来做这个呢?上帝,这太快了。我没有想到我会用地图。非常感谢大家,所有的答案都非常有用!!!现在还不清楚你们想做什么,但为什么你们不能用地图来做这个呢?上帝,那个太快了。我没有想到我会用地图。非常感谢大家,所有的答案都非常有用!!!你应该编辑你的帖子<代码>StringBuffer缓冲区必须在开关块之外创建。谢谢,在您发表评论之前这样做了:)我反对这一点,因为将来很难添加新案例。集合是一种更好的路由。在Java中不能切换字符串。至少现在还不能…)你可以试着打开他们的哈希代码,但这仍然不能保证。你应该编辑你的帖子<代码>StringBuffer缓冲区必须在开关块之外创建。谢谢,在您发表评论之前这样做了:)我反对这一点,因为将来很难添加新案例。集合是一种更好的路由。在Java中不能切换字符串。至少现在还不能…)你可以试着打开他们的哈希代码,但这仍然不能保证。@Timothy:H