在java中用动态名称分配变量

wlp8pajw  于 2021-07-03  发布在  Java
关注(0)|答案(7)|浏览(346)

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

int n1,n2,n3;

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

如何在java中实现这一点?

vlurs2pr

vlurs2pr1#

如果您想访问某种类型的动态变量,可以使用反射。但是,反射不适用于局部变量。它只适用于类属性。
一个粗略、快速、肮脏的例子是:

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

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

oo7oh9g9

oo7oh9g92#

请这样做:

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

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

wlwcrazw3#

这不是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);
}

可以使用反射动态引用源代码中声明的变量。但是,这只适用于作为类成员的变量(即静态和示例字段)。它不适用于局部变量。参见@fyr的“快速和肮脏”示例。
然而,在java中不必要地做这种事情是个坏主意。它效率低下,代码更复杂,而且由于依赖于运行时检查,因此更脆弱。这不是“动态名称变量”。最好将其描述为对具有静态名称的变量的动态访问。
那句话有点不准确。如果使用bcel或asm,可以“声明”字节码文件中的变量。但别这么做!那就是疯狂!

w51jfk4q

w51jfk4q4#

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

int[] n = new int[4];

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

cclgggtu5#

java中的动态变量名
没有这种事。
在您的情况下,可以使用数组:

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

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

xzv2uavs

xzv2uavs6#

你应该使用 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");
qq24tv8q

qq24tv8q7#

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

相关问题