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

Posted

技术标签:

【中文标题】在 Java 中使用动态名称分配变量【英文标题】:Assigning variables with dynamic names in Java 【发布时间】:2016-01-14 10:45:57 【问题描述】:

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

int n1,n2,n3;

for(int i=1;i<4;i++)

    n<i> = 5;

如何在 Java 中实现这一点?

【问题讨论】:

您能澄清一下您的问题吗? 你需要为局部变量做这个吗?为什么不是数组元素? @ Eng.Fouad : 我想通过变量名动态访问变量。 @Ashish Anand 你的意思是***.com/questions/6629995/… 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

int[] n = new int[4];

for(int i=1;i<4;i++)

    n[i] = 5;

【讨论】:

不想使用数组。我想根据某些条件动态访问变量 (n1,n2,n3)。【参考方案3】:

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

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

【讨论】:

非常感谢,得到了我想要的东西。最后一部分(Map)。 应该注意的是,即使有可能,它也不应该是你真正会做的事情。你不会从中得到任何东西;你实际上会失去可读性。如果您想链接它们,请改用Map&lt;String, T&gt;,不要开始弄乱您的实际代码。 @JeroenVannevel - 这就是我所说的“疯狂”:-)【参考方案4】:

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

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

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

对于更一般的(name, value) 对,请使用Map&lt;&gt;

【讨论】:

【参考方案5】:

试试这个方法:

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

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

【讨论】:

【参考方案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);
        
    

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

【讨论】:

当您需要将 android 的传感器 event.values[] 转换为一组变量时非常有用。 event.values[] 的长度可以从 1 到 6,并且可以很方便地进行转换,在我的情况下,用于无数组的 json 封送处理。【参考方案7】:

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

【讨论】:

以上是关于在 Java 中使用动态名称分配变量的主要内容,如果未能解决你的问题,请参考以下文章

使用动态变量名称一次分配多个变量

是否可以在Java中动态生成变量名称?

在 LESS CSS 中动态定义一个变量

在 WIX 中运行时为快捷方式动态分配名称

为向量条目分配名称而不为向量分配变量名称?

如何将名称动态分配给 RFID 阅读器连接的串行端口