簡體   English   中英

java中的枚舉是故障安全的嗎? 如果是,如何?

[英]Is Enumeration in java is Fail-safe? if yes how?

java中有故障安全迭代器,它創建集合的副本以迭代以提供故障安全行為。

枚舉適用於遺留 Java 類 Vector、Stack 和 HashTable 等(這些是同步集合)。

java中的枚舉如何是故障安全的,它如何提供故障安全行為? 它是否也為迭代創建了集合的副本?

我不會稱Enumeration故障安全。

至少不是Vectorelements()方法返回的實現:

public Enumeration<E> elements() {
    return new Enumeration<E>() {
        int count = 0;

        public boolean hasMoreElements() {
            return count < elementCount;
        }

        public E nextElement() {
            synchronized (Vector.this) {
                if (count < elementCount) {
                    return elementData(count++);
                }
            }
            throw new NoSuchElementException("Vector Enumeration");
        }
    };
}

如果在迭代時修改Vector則此實現可能會導致不良行為而不會引發異常。

例如,以下代碼將導致無限循環,其中每次調用els.nextElement ()將返回相同的元素"a"

Vector<String> vec = new Vector<> ();
vec.add ("a");
vec.add ("b");
vec.add ("c");
Enumeration<String> els = vec.elements ();
while (els.hasMoreElements ()) {
    System.out.println (els.nextElement ());
    vec.add (0,"d");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM