1

我试图循环已经在注册类中填充的值。我已经getInstance()在注册类的方法中放置了一个断点。当光标到达下面的for循环代码时。

for (final Registration.HolderEntry entry : Registration.getInstance()) {
        // do other things..
}

我对此做了F5。然后它转到getInstance()注册类的方法(下面是类)。当我当时检查instance变量时,我总是看到listOfBundles列表中填充的值很好。

但是,如果我继续按 F5,在某些时候它会涉及到iteratorRegistration 类中的方法,然后如果我检查 on 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
}

我希望这个问题足够清楚。谁能告诉我我要去这里有什么问题?

4

1 回答 1

0

因为你使用静态实例总是返回相同的对象

 public static Registration getInstance()

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

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

我不知道你的真正要求。但尝试使用它。

public static Registration getInstance() {
        return new Registration();;
    }
于 2013-09-04T03:18:42.957 回答