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

问题描述 投票:0回答:7

我想在java中分配一组变量如下:

int n1,n2,n3;

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

如何在 Java 中实现这一点?

java variables dynamic-variables
7个回答
126
投票

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

根据您要实现的目标,您应该使用数组,

List
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);
}

可以使用反射来动态引用已经在源代码中声明的变量。但是,这 only 适用于作为类成员的变量(即静态和实例字段)。它不适用于局部变量。请参阅@fyr 的“快速而肮脏”的示例。

然而,在 Java 中不必要地做这种事情是一个坏主意。它效率低下,代码更复杂,而且由于您依赖运行时检查,因此它更脆弱。这不是“具有动态名称的变量”。最好将其描述为对具有静态名称的变量的动态访问。


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


38
投票

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

一个粗略的快速和肮脏的例子是这样的:

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);
        }
    }
}

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


14
投票

你需要的是命名数组。我想写下面的代码:

int[] n = new int[4];

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

12
投票

你应该使用

List
array
代替

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;
}

对于更一般的

(name, value)
对,使用
Map<>


6
投票

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


5
投票

试试这个方法:

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

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }
© www.soinside.com 2019 - 2024. All rights reserved.