好的,我有以下代码:
Random rnd = new Random();
int i = 0;
while(i<1000) {
String name = "event" + i;
Event name = new Event(rnd.nextInt(100000)); //ERROR duplicate variable
SimEngine.getScheduler().addEventToQueue(event);
i++;
}
System.out.println(SimEngine.getScheduler().getQueue().iterator());
我知道两次宣布名字毫无意义,但我希望你能看到我想要做的事情。因为我想要名称为event1,event2,event3等的Event对象。
如何让我使用String名称作为Event对象的名称?
答案 0 :(得分:6)
因为我想要名称为event1,event2,event3等的Event对象。
对象不(通常)具有名称。变量有名字。你真的不希望变量名为event1
,event2
等变量。
在这种情况下,如果你真的需要通过索引访问事件,你基本上应该使用数组。
Event[] events = new Event[1000];
for (int i = 0; i < 1000; i++) {
events[i] = new Event(rnd.nextInt(100000));
SimEngine.getScheduler().addEventToQueue(events[i]);
}
当然,如果你以后不打算使用这个变量,那么无论如何它都是毫无意义的,你可以和以下人一样:
for (int i = 0; i < 1000; i++) {
SimEngine.getScheduler().addEventToQueue(new Event(rnd.nextInt(100000));
}
如果这个特定类的 具有与每个实例关联的名称,我怀疑你需要将该名称传递给构造函数。
答案 1 :(得分:4)
您不能 1 ,但您可以改为使用Map<String,Event>
,并将变量名称作为键,将对象作为值。
要访问“变量”,您可以使用Map.get()
和Map.put()
。有点像:
Map<String,Event> varaibles = new HashMap<String,Event>();
variables.put("event" + i, new Event(...)) //setting new "varaibles"
Event myEvent = variables.get(someString); //getting the objects assigned to a "variable"
(1)可以用reflection部分完成。如果你已经有了变量(没有声明新变量) - 你可以使用反射API按名称访问变量,但它没有被修改。
答案 2 :(得分:1)
使用数组或哈希表。
Map<String, Event> m = new HashMap<String, Event>();
您不能(至少不容易)在运行时设置变量名称。
答案 3 :(得分:1)
您不必为每个对象命名,以便使用它们的一系列数据结构,数组或地图的数据结构 所以你可以做点什么
SimEngine.getScheduler().addEventToQueue(new Event(rnd.nextInt(100000)));
是你想要的吗?