我试图循环已经在Registration类中填充的值。我已经在注册类的getInstance()
方法中放了一个断点。当光标到达下面的循环代码时。
for (final Registration.HolderEntry entry : Registration.getInstance()) {
// do other things..
}
我做了F5。然后它就是注册类的getInstance()
方法(下面是类)。当我在那时检查instance
变量时,我总是看到listOfBundles
列表中填充的值很好。
但是如果我再次按下F5,那么它会在注册类中找到iterator
方法,然后如果我在listOfBundles list
上检查,我在该列表中看不到任何值是我无法理解为什么会发生这样的事情。没有其他代码正在运行,可能会更改listOfBundles
的值。
public class Registration implements Iterable<Registration.HolderEntry> {
private List<String> listOfBundles = new LinkedList<String>();
private final Map<String, HolderEntry> bundleMapper = new HashMap<String, HolderEntry>();
private Registration() {
//
}
private static class BundlesHolder {
static final Registration instance = new Registration();
}
public static Registration getInstance() {
return BundlesHolder.instance;
}
public synchronized void registerBundles(final String bundleName, final IBundleCollection collection) {
HolderEntry bundleHolder = new HolderEntry(bundleName, collection);
bundleMapper.put(bundleName, bundleHolder);
listOfBundles.add(bundleName);
}
@Override
public synchronized Iterator<HolderEntry> iterator() {
List<String> lst = new LinkedList<String>(listOfBundles);
List<HolderEntry> list = new LinkedList<HolderEntry>();
for (String clName : lst) {
if (bundleMapper.containsKey(clName)) {
list.add(bundleMapper.get(clName));
}
}
Collections.reverse(list);
return list.iterator();
}
// some other code
}
我希望这个问题足够明确。谁能告诉我我要去哪儿错了?
答案 0 :(得分:0)
因为你使用静态实例总是从
返回相同的对象 public static Registration getInstance()
方法。 (只有一次注册初始化)。
没有不同的对象是你的迭代。同一个对象正在迭代你的迭代。它不像应用于迭代时所做的每个对象更改,但它是迭代并更改值的同一对象。
我不知道你真正的要求。但试着用这个。
public static Registration getInstance() {
return new Registration();;
}