如果我想让变量变得灵活,可以设置它吗?我认为一个例子会让它更容易理解。
String hallo1;
String hallo2;
for(int i = 0; i < 2; i++) {
hallo & i = Integer.toString(i);
}发布于 2010-02-09 22:51:37
如果您确实需要在编译时具有未知名称的变量,则可以通过创建一个包含任意名称和值的结构来实现此效果。例如,您可以创建一个HashMap,其中键是名称。那么你上面的例子就会变成这样:
HashMap myData=new HashMap();
for (int i=0;i<2;++i)
{
myData.put("hallo"+i,Integer.toString(i));
}稍后,您可以使用以下命令将它们提取出来:
String whatever=myData.get("hallo1");等。
当然,您不能直接从map中将值作为变量访问,您必须始终使用put和get来更新和检索它们,但概念是相同的。
也就是说,我在这样做时会非常谨慎,因为这会使代码很难维护。如果您需要的名称真的突然出现--如果您正在编写泛型代码来读取用户在运行时键入名称的任意数据库表或类似的东西--那就很酷了。但是如果你认为这是一个便捷的捷径,比如:
if (region.equals("1"))
region1Total+=amount;
else
region2Total+=amount;我的答案很简单:不要!如果使用if语句和普通变量,代码将更易于维护。然后,任何阅读代码的人都可以查看您的声明,了解所有可能的变量是什么。您可以进行文本搜索,以查找使用它们的所有位置。如果变量名拼写错误,您将得到一条干净的编译时错误消息,而不是神奇地创建一个新变量。等。
另一方面,如果你可以写一些像这样的东西
String n=getInputFromScreen();
String s=getAnotherInputFromScreen();
hallo & n = s;您不知道程序中存在哪些变量,也无法跟踪它们的使用位置。
发布于 2010-02-09 22:09:19
不,你不能。(幸运的是)在Java语言中没有eval()这样的东西。
你最好的选择就是拿一个Array或ArrayList。下面是一个数组示例:
String[] hallos = new String[2];
for (int i = 0; i < 2; i++) {
hallos[i] = Integer.toString(i);
}发布于 2010-02-09 22:13:33
使用reflection在技术上是可行的,但我建议您不要这么做,除非您有很好的理由这样做。这会使你的代码更难调试和阅读。
编辑:
正如评论所强调的那样:
https://stackoverflow.com/questions/2229597
复制相似问题