在 Java 中分配具有动态名称的变量

2022-08-31 09:49:57

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

int n1,n2,n3;

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

如何在Java中实现这一点?


答案 1

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

根据您要实现的目标,您应该使用数组,a或;例如: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中不必要地做这种事情是一个坏主意。它效率低下,代码更复杂,并且由于您依赖于运行时检查,因此它更加脆弱。这不是“具有动态名称的变量”。最好将其描述为对具有静态名称的变量的动态访问。


1 - 这种说法略有不准确。如果使用 BCEL 或 ASM,则可以“声明”字节码文件中的变量。但不要这样做!那条路就是疯了!


答案 2

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

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

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

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