在 Java 中为变量分配动态名称

Assigning variables with dynamic names in Java

提问人:Ashish Anand 提问时间:7/18/2011 最后编辑:user2864740Ashish Anand 更新时间:2/8/2019 访问量:208770

问:

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

int n1,n2,n3;

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

如何在 Java 中实现这一点?

java 动态变量

评论

1赞 Eng.Fouad 7/18/2011
你能澄清一下你的问题吗?
7赞 Ray Toal 7/18/2011
您需要对局部变量执行此操作吗?为什么不数组元素?
0赞 Ashish Anand 7/18/2011
@Eng.Fouad :我想通过变量的名称动态访问变量。
0赞 mKorbel 7/18/2011
@Ashish阿南德,你的意思是 stackoverflow.com/questions/6629995/......

答:

12赞 jmj 7/18/2011 #1

您应该使用 or 代替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");
14赞 AlexR 7/18/2011 #2

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

int[] n = new int[4];

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

评论

1赞 Ashish Anand 7/18/2011
不想使用数组。我想根据某些条件动态访问变量(n1,n2,n3)。
126赞 Stephen C 7/18/2011 #3

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

根据您要实现的目标,您应该使用数组 a 或 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,则可以在字节码文件中“声明”变量。但不要这样做!那条路就是疯狂!

评论

1赞 Ashish Anand 7/18/2011
非常感谢,得到了我想要的东西。最后一部分(Map<String, integer> )。
1赞 Jeroen Vannevel 12/15/2013
应该注意的是,即使有可能,也不应该是你实际会做的事情。你没有从中得到任何东西;你实际上会失去可读性。如果你想链接它们,请改用,不要开始弄乱你的实际代码。Map<String, T>
3赞 Stephen C 12/15/2013
@JeroenVannevel - 这就是我所说的“疯狂”的意思:-)
8赞 Op De Cirkel 7/18/2011 #4

Java
中的动态变量名称 没有这样的事情。

在你的例子中,你可以使用数组:

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

对于更通用的对,请使用(name, value)Map<>

5赞 user784540 7/18/2011 #5

试试这个方法:

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

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }
39赞 fyr 7/18/2011 #6

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

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

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赞 Farshid T 6/22/2015
当您需要将 Android 的传感器 event.values[] 转换为一组变量时,这非常好。event.values[] 的长度可以从 1 到 6,让它转换很方便,在我的情况下是无数组的 JSON 封送处理。
6赞 everton 7/18/2011 #7

你没有。你能做的最接近的事情就是使用地图来模拟它,或者定义你自己的对象来处理。