在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的集合一样,但这不是公共类..
任何建议如何优雅地解决这个问题?
由于
答案 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);
}