-3

Collections.unmodifiableList の実装では、指定されたリストが既に UnmodifiableList であっても、常に UnmodifiableList で指定されたリストをラップしていることがわかります... したがって、このメソッドを何度も呼び出すと、次のような巨大なスタック トレースが得られます。

  at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)
    at java.util.Collections$UnmodifiableCollection.size(Collections.java:998)

リストが既に UnmodifiabelList であるかどうかを確認し、Google のコレクションと同じように同じリストを返すことを考えましたが、これはパブリック クラスではありません。

これをエレガントに解決する方法はありますか?

ありがとう

4

1 に答える 1

2

リストがラップされているすべての場所を変更できる場合の回避策は、独自の変更不可能なリストラッパーを使用し、ラップする前にリストがまだこのリストラッパーのインスタンスになっていないかどうかを確認することです。

別の回避策は、使用することです

private static final Class<?> UNMODIFIABLE_LIST_CLASS = 
    Collections.unmodifiableList(new ArrayList<Object>(0)).getClass();

...

if (!theList.getClass().equals(UNMODIFIABLE_LIST_CLASS)) {
    return Collections.unmodifiableList(theList);
}
于 2013-05-09T17:03:28.500 に答える