Collections.unmodifiableList包装已经不可修改的列表?

时间:2013-05-09 16:42:36

标签: java collections unmodifiable

在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的集合一样,但这不是公共类..

任何建议如何优雅地解决这个问题?

由于

1 个答案:

答案 0 :(得分: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);
}