-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 并返回相同的列表,就像谷歌的收藏一样,但这不是公共课程。

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

谢谢

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 回答