在运行时期间在类中修改的值

时间:2013-09-04 02:00:35

标签: java iterator linked-list

我试图循环已经在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
}

我希望这个问题足够明确。谁能告诉我我要去哪儿错了?

1 个答案:

答案 0 :(得分:0)

因为你使用静态实例总是从

返回相同的对象
 public static Registration getInstance()

方法。 (只有一次注册初始化)。

没有不同的对象是你的迭代。同一个对象正在迭代你的迭代。它不像应用于迭代时所做的每个对象更改,但它是迭代并更改值的同一对象。

我不知道你真正的要求。但试着用这个。

public static Registration getInstance() {
        return new Registration();;
    }