在java中创建具有特定名称的动态对象

时间:2013-10-22 19:14:17

标签: java

我有一个测试输入文件,其中针对不同场景应创建不同数量的对象。

例如:对于一个测试输入,它们必须是3个要创建的对象,名称为v0,v1,v2,而对于其他测试输入,它们必须是5个要创建的对象,名称为v0,v1,v2,v3,v4。

对于5对象的静态程序如下:

    Vertex v0 = new Vertex("a");
    Vertex v1 = new Vertex("b");
    Vertex v2 = new Vertex("c");
    Vertex v3 = new Vertex("d");
    Vertex v4 = new Vertex("e");
    Vertex v5 = new Vertex("f");

我想让它变得像k = 5(对象的数量)这样的动态:

for(int i=0;i<k;i++){
    Vertex vi= new Vertex("str");
}

3 个答案:

答案 0 :(得分:10)

您需要的是Map <String, Vertext>

String arr = new String[]{"a", "b", "c", "d", "e", "f"};
Map<String, Vertex> map = new HashMap<>();
for(int i = 0; i < arr.length; i++) {
    map.put("v" + i, new Vertext(arr[i]));
}

然后你可以使用他们的名字来检索对象,例如,如果你需要v3,你可以写一下:

Vertex v3 = map.get("v3"); // returns the object holding the String "d"
System.out.println(v3.somevariable);

如果somevariable持有你在构造函数中传递的字符串,那么print语句的输出将是

d

答案 1 :(得分:3)

用普通的Java做这件事是不可能的。您应该能够以某种方式使用ASM或某些字节代码操作库来实现它,但它并不值得付出努力。最好的方法是使用Map。请注意,Map是一个接口,HashMap是其实现。

String[] names = {"v1", "v2", "v3"};
String[] constructorArgs = {"a", "b", "c"};
Map<String, Vertex> map = new HashMap<String, Vertex>();
for (int i = 0; i < names.length; i++)
{
    map.put(names[i], new Vertex(constructorArgs[i]));
}

for (int i = 0; i < names.length; i++)
{
    Vertex v = map.get(names[i]);
    //do whatever you want with this vertex
}

您可以通过map.get(name)使用他们的名字访问变量。

有关ASM的更多信息,请参阅this answer

答案 2 :(得分:2)

您可以使用Map,其中密钥为String(名称),值为Vertex

E.g:Map<String, Vertex>

然后你可以这样做:

Map<String, Vertex> testObjs = new HashMap<String, Vertex>();

for(int i = 0; i < k; i++)
    testObjs.put("v" + String.valueOf(i), new Vertex(i));

// The names would be like v1, v2, etc.
// Access example
testObjs.get("v1").doVertexStuff();