我想知道是否可以根据变量名创建属性。更具体地说,请参阅以下示例。
for(int i = 0; i < 10; i++){
String number+i = i;
}
这意味着每个属性的基本名称'number'都会被它的值i扩展。所以我可以举例如下(假设这些将被存储和访问,并忽略属性/变量名称不应包含数字的事实,但你明白了):
System.out.println(number5); //You could do the same example with Strings and not numbers
显然第一部分没有编译,但我认为摘录清楚地说明了我的要求。是否有可能的程序语言?或者Java中有一个技巧可以实现这一目标吗?
然而,没有它的原因是什么?显然,如果这是可能的,属性可以存储两个变量值(属性的名称和值本身),这可能会导致混淆。但这是没有它的唯一原因还是还有其他什么?
答案 0 :(得分:4)
您应该查看Map(例如HashMap实现),这将允许您拥有属性的动态密钥。
Map<String, Object> newMap = new HashMap<>();
newMap.put("whatever", "Value 1");
for(int i = 0; i < 10; i++){
newMap.put(number+i, i);
}
答案 1 :(得分:1)
不这样做的一个原因是它使代码模糊不清。一个简单的例子:
int number = 7;
int number2 = 5;
int x = 2;
number = number+x
最后一行是什么意思?我们是将number
设置为等于自身加2,还是我们将其设置为等于number2
?
数组具有括号语法,它将索引与变量分开,因此它们不会被混合在一起。
答案 2 :(得分:1)
你想做什么看起来像创建动态变量(在这里的循环中),然后有办法重用它们
Java是一种强类型语言,并没有像JavaScript那样的全局上下文
所以它没有提供这样的功能
不建议引入全局上下文来存储变量,因为它引入了潜在的变量冲突。
因此,在循环中声明的变量具有当前迭代的生命周期:
for(int i = 0; i < 10; i++){
String number+i = i;
}
显然,如果可能的话,属性可以存储两个 变量值(属性的名称和值本身) 可能会引起混淆。
不是属性而是变量,PhilippeAuriach
通过引入HashMap
来解决此问题。
答案 3 :(得分:1)
我认为简单地创建变量名称为int number+1 = 10, int number+2 = 20...
是不可能的,因为如果您尝试将number+1
的值分配给另一个变量,它可能会太混乱。看看这个:int another = number+1
。在这种情况下,编译器不知道是否要查找名为number
的变量并将其递增或查找名为number+1
的变量。
但是反射为你提供了一些你想要实现的东西,但我建议只使用数组或Map,这些选项看起来更清晰,更简单,我认为它们为你提供了更多使用反射的安全性。无论如何,请看这个使用反射来动态使用字段名称的简单示例(请注意,在这种情况下,字段需要声明为public):
public class Test {
public int field1 = 1;
public int field2 = 2;
public int field3 = 3;
// this method changes values assigned to field1, field2 and field3:
public void setFields()
throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
for (int i = 1; i < 4; i++) {
Test.class.getField("field" + i).set(this, 25); // Here is what you may be looking for, you dynamically find field1, field2, ...
}
}
public static void main(String[] args)
throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
Test t = new Test();
for (int i = 1; i < 4; i++) {
int j = (Test.class.getField("field" + i).getInt(t)); // Another example
System.out.print(j + " ");
}
t.setFields();
for (int i = 1; i < 4; i++) {
int j = (Test.class.getField("field" + i).getInt(t));
System.out.print(j + " ");
}
}
}
执行此程序时得到的输出:
1 2 3 25 25 25
如您所见,在更改分配给field1
,field2
和field3
的值时,以及将它们打印到控制台时,我也不必使用他们的名字,我可以使用循环并将字符串field
连接到我得到的i
索引&#34;对于&#34;环。无论如何,在声明这些变量时,除了输入field1, etc...