我想知道是否可以根据变量名称创建属性。更具体的请看下面的例子。
for(int i = 0; i < 10; i++){
String number+i = i;
}
这意味着每个属性的基本名称“数字”都由它的值 i 扩展。因此,我可以例如执行以下操作(假设这些将被存储和访问,以及忽略属性/变量名称不应包含数字的事实,但您明白了):
System.out.println(number5); //You could do the same example with Strings and not numbers
显然,第一部分没有编译,但我认为这段摘录清楚地说明了我在问什么。是否有任何程序语言可以做到这一点?或者Java中有什么技巧可以使这成为可能?
然而,没有它背后的原因是什么?显然,如果这是可能的,一个属性可以存储两个变量值(属性的名称和值本身),这可能会导致混淆。但这是不拥有它的唯一原因还是还有其他原因?
我认为简单地创建变量名称int number+1 = 10, int number+2 = 20...
是不可能的,因为如果您尝试将值分配number+1
给另一个变量可能会太混乱。看看这个:int another = number+1
。在这种情况下,编译器不知道是查找带有 name 的变量number
并增加它还是查找带有 name 的变量number+1
。
但是反射为您提供了一些您想要实现的目标,但我建议简单地使用数组或 Map,这些选项看起来更清晰、更简单,我认为它们比使用反射为您提供了更多的安全性。无论如何,看看这个使用反射动态使用字段名称的简单示例(注意,在这种情况下,字段需要声明为公共):
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
,我从有“for”循环。无论如何,在声明这些变量时,我不可能以任何其他方式写出它们的名字,而只能键入field1, etc...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句