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

Ash*_*and 91 java variables dynamic-variables

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

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能在Java中实现这一目标?

Ste*_*n C 106

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

根据您要实现的目标,您应该使用数组,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);
}
Run Code Online (Sandbox Code Playgroud)

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

然而,在Java中不必要地做这种事情是一个坏主意.这是低效的,代码更复杂,并且由于您依赖运行时检查它更脆弱.这不是"动态名称的变量".最好将其描述为使用静态名称动态访问变量.


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

  • @JeroenVannevel - 这就是我所说的"疯狂":-) (2认同)

fyr*_*fyr 32

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

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 当您需要将Android的传感器event.values []转换为一组变量时,这非常好.event.values []的长度可以从1到6,并且它可以很方便地进行转换,在我的情况下是无数组的json编组. (2认同)

Ale*_*exR 11

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

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}
Run Code Online (Sandbox Code Playgroud)


Jig*_*shi 9

你应该使用Listarray代替

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Run Code Online (Sandbox Code Playgroud)

要么

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;
Run Code Online (Sandbox Code Playgroud)

甚至更好

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

//conditionally get 
map.get("n1");
Run Code Online (Sandbox Code Playgroud)


Op *_*kel 6

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

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

int[] n = new int[3];
for() {
 n[i] = 5;
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

试试这个方法:

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

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


eve*_*ton 5

你没有。您可以做的最接近的事情是使用 Maps 来模拟它,或者定义您自己的对象来处理。