是否可以在Java中使用变量属性名称?如果没有,为什么?

时间:2017-12-11 19:57:47

标签: java

我想知道是否可以根据变量名创建属性。更具体地说,请参阅以下示例。

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中有一个技巧可以实现这一目标吗?

然而,没有它的原因是什么?显然,如果这是可能的,属性可以存储两个变量值(属性的名称和值本身),这可能会导致混淆。但这是没有它的唯一原因还是还有其他什么?

4 个答案:

答案 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

如您所见,在更改分配给field1field2field3的值时,以及将它们打印到控制台时,我也不必使用他们的名字,我可以使用循环并将字符串field连接到我得到的i索引&#34;对于&#34;环。无论如何,在声明这些变量时,除了输入field1, etc...

之外,我无法以任何其他方式写出自己的名字。