在Java中使用动态变量名赋值

112

我想在Java中按照以下方式分配一组变量:

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}

我该如何在Java中实现这个?


1
请问您能否澄清一下您的问题? - Eng.Fouad
7
需要这样做来处理局部变量吗?为什么不是数组元素? - Ray Toal
@Eng.Fouad:我想通过动态名称访问变量。 - Ashish Anand
@Ashish Anand,您的意思是https://dev59.com/6VnUa4cB1Zd3GeqPWw3f吗? - mKorbel
7个回答

126

这并不是Java的正确用法。Java中没有动态变量。Java变量需要在源代码中声明1

根据你要实现的目标,你应该使用数组、ListMap等数据结构;例如:

int n[] = new int[3];
for (int i = 0; i < 3; i++) {
    n[i] = 5;
}

List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
    n.add(5);
}

Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
    n.put("n" + i, 5);
}
可以使用反射来动态引用在源代码中声明的变量。但是,这仅适用于类成员变量(即静态和实例字段),不适用于局部变量。请参见@fyr的"快速脏"示例。
然而,在Java中不必要地这样做是一个坏主意。它效率低下,代码更加复杂,而且由于您依赖运行时检查,因此更加脆弱。并且这不是"具有动态名称的变量",更好地描述为对具有静态名称的变量进行动态访问。
该语句略有不准确。如果使用BCEL或ASM,则可以在字节码文件中“声明”变量。但是不要这样做!那将是疯狂的道路!

1
非常感谢,我找到了我想要的东西。最后一部分(Map<String, integer>)。 - Ashish Anand
1
需要注意的是,即使可能做到这一点,也不应该实际去做。你不会从中获得任何好处;实际上,你会失去可读性。如果你想要链接它们,使用 Map<String, T> 代替,不要开始搞乱你的实际代码。 - Jeroen Vannevel
3
@JeroenVannevel - 这就是我所说的“疯狂” :-) - Stephen C

39

如果您想以某种动态方式访问变量,则可以使用反射。但是反射不适用于局部变量,仅适用于类属性。

一个简单的例子如下:

public class T {
    public Integer n1;
    public Integer n2;
    public Integer n3;

    public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
            NoSuchFieldException {

        for (int i = 1; i < 4; i++) {
            T.class.getField("n" + i).set(this, 5);
        }
    }
}

您需要在各个方面改进此代码,它只是一个示例。这也不被认为是好的代码。


3
在将安卓传感器的 event.values[] 转换成一组变量时,这个工具非常好用。event.values[] 的长度可能从1到6不等,将其转换为变量后可以很方便地进行无数组的JSON编组。 - Farshid T

14
你需要的是命名数组。我想编写以下代码:
int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}

1
不想使用数组。我想根据某些条件动态访问变量(n1,n2,n3)。 - Ashish Anand

12

你应该使用 Listarray 替代。

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

或者

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;

或者更好的是

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);

//conditionally get 
map.get("n1");

8

Java中的动态变量名
这种东西是不存在的。

在您的情况下,您可以使用数组:

int[] n = new int[3];
for() {
 n[i] = 5;
}

对于更一般的 (名称, 值) 对,请使用 Map<>


6

你不能直接实现它,最接近的方法是使用地图模拟它,或定义自己的对象来处理。


5
尝试这种方法:
    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接