我正试图循环使用Registration类中已经填充的值。我已经在Registration类的getInstance()
方法中放置了一个断点。当光标到达下面的循环代码时。
for (final Registration.HolderEntry entry : Registration.getInstance()) {
// do other things..
}
我在上面做了F5。然后它粘到Registration类的getInstance()
方法(下面是该类)。当我检查instance
变量时,我总是看到listOfBundles
列表中填充的值,这很好。
但是,如果我继续按F5键,在某个时刻,它会出现在Registration类中的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
}
我希望这个问题足够清楚。有人能告诉我我来这里怎么了吗?
因为使用静态实例总是从返回相同的对象
public static Registration getInstance()
方法。(仅初始化一次注册)。
没有什么不同的对象是您的迭代。同一个对象正在您的迭代中迭代。它不像是应用于您在迭代时所做的每一个对象更改,而是和您迭代并更改值的对象相同。
我不知道你的真正要求。但是试着用这个。
public static Registration getInstance() {
return new Registration();;
}