-3

In Collections.unmodifiableList implementation I see that it always wraps the given list with UnmodifiableList even if the given list is already UnmodifiableList... So if i'm calling this method over and over - i get a huge stack trace, like this:

  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)

I thought to check if the list is already UnmodifiabelList and just return the same list, like Google's collections does, but this is not a public class..

Any suggeestions how to solve this elegantly?

Thanks

duduamar
  • 3,816
  • 7
  • 35
  • 54
  • Can you show us how to produce that behavior? – zw324 May 09 '13 at 16:49
  • 2
    Use the aforementioned Google collections? ;) – Louis Wasserman May 09 '13 at 16:51
  • 4
    Why are you calling this method over and over again in the first place? – JB Nizet May 09 '13 at 16:52
  • Just create a list l and run in loop l = Collections.unmodifiabeList(l) for 500 times for example. Then call l.size() on that list. – duduamar May 09 '13 at 16:52
  • I didnt find exact same thing in google.. they offer immutable copy, and I want immutable view of that list... – duduamar May 09 '13 at 16:54
  • about why i'm using that - this is legacy code... i can try to dig in and get rid of it, but if a smaller solution exist, i prefer it... – duduamar May 09 '13 at 16:54
  • @duduamar You are getting exactly what your code specified. The method works as documented. I fail to understand why you are surprised, or why you would ever write any such code in the first place. Not a real question. – user207421 May 10 '13 at 01:19

1 Answers1

2

A workaround I see, if you can modify all the places where the lists are wrapped, is to use your own unmodifiable list wrapper, and check if the list is not already an instance of this list wrapper before wrapping it.

Another workaround would be to use

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);
}
JB Nizet
  • 678,734
  • 91
  • 1,224
  • 1,255