添加新对象时运行时覆盖列表元素
Runtime overwriting List elements when adding new object
我有任务实现 Runnable
,需要使用扩展 TimerTask
.
的自定义 class 填充 ArrayList
我的代码:
public class ClusterSessionTask implements Runnable {
@Override
public void run() {
CheckTask checkTask = null;
Map<String, String> keyspaces = getKeyspaces(cluster_name);
for (Map.Entry<String, String> key_to_colfam : keyspaces.entrySet()) {
String k = key_to_colfam.getKey();
String c = key_to_colfam.getValue();
checkTask = new CheckTask(k, c, session);
tasks.add(checkTask);
}
}
}
你可以看到我在 for 循环中的每次迭代都初始化了新的 CheckTask
,但我仍然在覆盖列表中的先前元素。
查看此调试信息:
在第一次迭代中您可以看到任务 a:b
但是第二个 a:b
被新任务覆盖 c:d
:
CheckTask
是 class 扩展 TimerTask
:
class CheckTask extends TimerTask {
private static int i = 0;
private static String keyspace;
private static String colfam;
private static CqlSession session;
CheckTask(String k, String c, CqlSession s) {
keyspace = k;
colfam = c;
session = s;
}
public void run() {
...
}
@Override
public String toString() {
return keyspace + ":" + colfam;
}
}
我做错了什么?它以某种方式通过引用传递对象并且 new
推荐被忽略?
谢谢
问题是构造函数中 keyspace、colfam、session 的静态关键字。
即使您创建 2 个实例,它们也会共享相同的值
我有任务实现 Runnable
,需要使用扩展 TimerTask
.
ArrayList
我的代码:
public class ClusterSessionTask implements Runnable {
@Override
public void run() {
CheckTask checkTask = null;
Map<String, String> keyspaces = getKeyspaces(cluster_name);
for (Map.Entry<String, String> key_to_colfam : keyspaces.entrySet()) {
String k = key_to_colfam.getKey();
String c = key_to_colfam.getValue();
checkTask = new CheckTask(k, c, session);
tasks.add(checkTask);
}
}
}
你可以看到我在 for 循环中的每次迭代都初始化了新的 CheckTask
,但我仍然在覆盖列表中的先前元素。
查看此调试信息:
在第一次迭代中您可以看到任务 a:b
但是第二个 a:b
被新任务覆盖 c:d
:
CheckTask
是 class 扩展 TimerTask
:
class CheckTask extends TimerTask {
private static int i = 0;
private static String keyspace;
private static String colfam;
private static CqlSession session;
CheckTask(String k, String c, CqlSession s) {
keyspace = k;
colfam = c;
session = s;
}
public void run() {
...
}
@Override
public String toString() {
return keyspace + ":" + colfam;
}
}
我做错了什么?它以某种方式通过引用传递对象并且 new
推荐被忽略?
谢谢
问题是构造函数中 keyspace、colfam、session 的静态关键字。
即使您创建 2 个实例,它们也会共享相同的值