首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按名称调用变量,编译时不知道该名称

按名称调用变量,编译时不知道该名称
EN

Stack Overflow用户
提问于 2010-02-09 22:06:41
回答 5查看 249关注 0票数 4

如果我想让变量变得灵活,可以设置它吗?我认为一个例子会让它更容易理解。

代码语言:javascript
复制
String hallo1;
String hallo2;

for(int i = 0; i < 2; i++) {
 hallo & i = Integer.toString(i);
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-09 22:51:37

如果您确实需要在编译时具有未知名称的变量,则可以通过创建一个包含任意名称和值的结构来实现此效果。例如,您可以创建一个HashMap,其中键是名称。那么你上面的例子就会变成这样:

代码语言:javascript
复制
  HashMap myData=new HashMap();
  for (int i=0;i<2;++i)
  {
    myData.put("hallo"+i,Integer.toString(i));
  }

稍后,您可以使用以下命令将它们提取出来:

代码语言:javascript
复制
  String whatever=myData.get("hallo1");

等。

当然,您不能直接从map中将值作为变量访问,您必须始终使用put和get来更新和检索它们,但概念是相同的。

也就是说,我在这样做时会非常谨慎,因为这会使代码很难维护。如果您需要的名称真的突然出现--如果您正在编写泛型代码来读取用户在运行时键入名称的任意数据库表或类似的东西--那就很酷了。但是如果你认为这是一个便捷的捷径,比如:

代码语言:javascript
复制
  if (region.equals("1"))
    region1Total+=amount;
  else
    region2Total+=amount;

我的答案很简单:不要!如果使用if语句和普通变量,代码将更易于维护。然后,任何阅读代码的人都可以查看您的声明,了解所有可能的变量是什么。您可以进行文本搜索,以查找使用它们的所有位置。如果变量名拼写错误,您将得到一条干净的编译时错误消息,而不是神奇地创建一个新变量。等。

另一方面,如果你可以写一些像这样的东西

代码语言:javascript
复制
  String n=getInputFromScreen();
  String s=getAnotherInputFromScreen();
  hallo & n = s;

您不知道程序中存在哪些变量,也无法跟踪它们的使用位置。

票数 2
EN

Stack Overflow用户

发布于 2010-02-09 22:09:19

不,你不能。(幸运的是)在Java语言中没有eval()这样的东西。

你最好的选择就是拿一个ArrayArrayList。下面是一个数组示例:

代码语言:javascript
复制
String[] hallos = new String[2];

for (int i = 0; i < 2; i++) {
    hallos[i] = Integer.toString(i);
}
票数 13
EN

Stack Overflow用户

发布于 2010-02-09 22:13:33

使用reflection在技术上是可行的,但我建议您不要这么做,除非您有很好的理由这样做。这会使你的代码更难调试和阅读。

编辑:

正如评论所强调的那样:

  1. 澄清一下,我强烈建议不要被所诱惑而使用反射。其他答案指出了实现目标的更好方法,例如array.
  2. Reflection不会帮助您处理局部变量。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2229597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档