在Java中使用动态名称分配变量


96

我想在Java中分配一组变量,如下所示:

int n1,n2,n3;

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

如何用Java实现呢?


1
你能澄清你的问题吗?
Enu.Fouad 2011年

4
您需要对局部变量执行此操作吗?为什么不使用数组元素?
Ray Toal

@ Eng.Fouad:我想通过变量名动态访问变量。
Ashish Anand

@Ashish阿南德你的意思stackoverflow.com/questions/6629995/...
mKorbel

Answers:


111

这不是您在Java中做事的方式。Java中没有动态变量。Java变量必须在源代码1中声明。

根据要实现的目标,应使用数组a List或a Map;例如

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中不必要地执行此类操作不是一个好主意。它效率低下,代码更加复杂,并且由于您依赖运行时检查,因此它更加脆弱。这不是“带有动态名称的变量”。最好将其描述为对具有静态名称的变量的动态访问。


1-该陈述有点不准确。如果使用BCEL或ASM,则可以在字节码文件中“声明”变量。但是不要这样做!那就是疯狂!


1
非常感谢,得到了我想要的东西。最后一部分(Map <String,integer>)。
Ashish Anand

1
应该注意的是,即使有可能,它也不应该是您真正要做的。您不会从中获得任何收益;您实际上会失去可读性。如果要链接它们,请改用a Map<String, T>,不要将您的实际代码弄乱。
Jeroen Vannevel 2013年

2
@JeroenVannevel-我的意思是“疯狂” :-)
Stephen C

35

如果要访问变量,可以使用反射。但是,反射不适用于局部变量。它仅适用于类属性。

一个粗略而肮脏的例子是这样的:

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
需要将Android的sensor event.values []转换为一组变量时非常有用。event.values []的长度可以从1到6,并且将其转换很方便,在我的情况下,它用于无数组json封送处理。
Farshid T

12

您需要的是命名数组。我想编写以下代码:

int[] n = new int[4];

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

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

10

您应该使用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");

7

Java中的动态变量名
没有这样的东西。

您可以使用数组:

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

对于更一般的(name, value)配对,请使用Map<>


4

尝试这种方式:

    HashMap<String, Integer> hashMap = new HashMap();

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

4

你不知道 您可以做的最接近的事情是使用地图进行仿真,或者定义自己的对象来处理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.