How about this as a proposed solution to avoid UnsupportedOperationException: 1. Renamed the internal ArrayList to ArrayWrappingList 2. Override add() in ArrayWrappingList and make it deprecated to warn people from using it.
On Fri, Nov 18, 2022 at 6:23 PM Ethan McCue <et...@mccue.dev> wrote: > I think there is potentially actionable feedback in that the exception > thrown when users bump into this limitation kinda sucks > > jshell> Arrays.asList(1, 2, 3).add(4); > | Exception java.lang.UnsupportedOperationException > | at AbstractList.add (AbstractList.java:155) > | at AbstractList.add (AbstractList.java:113) > | at (#8:1) > > jshell> try { Arrays.asList(1, 2, 3).add(4);} catch (Exception e) { > System.out.println(e.getMessage());} > null > > I think there would be value in overriding "add" and other such operations > to provide enough context for users to *understand* that > * they did an unsupported operation > * the list given by `Arrays.asList` was the cause > > If I had to guess, that's the core of the frustration. The process to get > from "not understanding what went wrong" -> "understanding what went wrong" > -> "knowing how to fix it" is high. > > The design problem is how much context can be conveyed in an exception > message/stack trace. > > There is a similar conversation to be had for the collections returned by > List.of() and similar. > > jshell> List.of().add(1) > | Exception java.lang.UnsupportedOperationException > | at ImmutableCollections.uoe (ImmutableCollections.java:142) > | at ImmutableCollections$AbstractImmutableCollection.add > (ImmutableCollections.java:147) > | at (#6:1) > > jshell> try { List.of(1, 2, 3).add(4);} catch (Exception e) { > System.out.println(e.getMessage());} > null > > There is a clue in the stack trace here though for List.of() with the > "ImmutableCollections" calls. Maybe if we took two moves > > 1. Renamed the internal ArrayList to something like ArrayWrappingList > 2. Overrode add > > then the stack trace could be enough (or better than the status quo) > > jshell> Arrays.asList(1, 2, 3).add(4); > | Exception java.lang.UnsupportedOperationException > | at ArrayWrappingList.add (ArrayWrappingList.java:155) > | at ArrayWrappingList.add (ArrayWrappingList.java:113) > | at (#8:1) > > On Fri, Nov 18, 2022 at 12:14 PM Andreas Røsdal <andreas.ros...@gmail.com> > wrote: > >> `new ArrayList<>(Arrays.asList(array))` is quite complex syntax to >> convert an array to an java.util.ArrayList, >> so a suggestion could be to add a new method to Arrays to convert an >> array to a normal java.util.ArrayList which is modifiable. >> >> Are there any low-hanging-fruit issues in core-libs-dev in >> bugs.openjdk.org that you are aware of that >> you would like me to help you implement? >> >> Thanks for considering my request. >> >> Regards, >> Andreas >> >> >> >> >> On Fri, Nov 18, 2022 at 5:51 PM Daniel Fuchs <daniel.fu...@oracle.com> >> wrote: >> >>> Hi Andreas, >>> >>> First of all, congratulations for seeking advice before working on >>> a PR. This is exactly how first contributions should start. Thank >>> you for that! >>> >>> Given the area in which you intended to work however, `core-libs-dev` >>> might have been a better list than `discuss` to start from. >>> >>> With regard to the meat of the issue however, and as noted by Ethan, >>> Arrays.asList() behaves as intended, and changing that would be a >>> major incompatible change, as many users of the API expect the list >>> returned by Arrays.asList to be immutable (and depend on it). >>> It is not possible nor desirable to change that. >>> >>> As for your observation, I believe that: >>> >>> `new ArrayList<>(Arrays.asList(array))` >>> >>> will get you what you want. >>> >>> best regards, >>> >>> -- daniel >>> >>> On 18/11/2022 16:29, Andreas Røsdal wrote: >>> > Yes, the exception comes when adding objects to the returned list. So >>> I >>> > would like a convenient way to use Arrays to convert an array to a >>> > normal modifiable java.util.ArrayList, instead of this AbstractList. >>> > >>> > >>> > On Fri, Nov 18, 2022 at 5:23 PM Ethan McCue <et...@mccue.dev >>> > <mailto:et...@mccue.dev>> wrote: >>> > >>> > What situation were you encountering the exception? Was it when >>> > trying to add to the returned list? >>> > >>> > If so, that's expected. Arrays.asList only wraps an underlying >>> > array, it can't grow it. By that measure List.of() is even more >>> > unintuitive because you can't set anything. >>> > >>> > On Fri, Nov 18, 2022, 11:06 AM Andreas Røsdal >>> > <andreas.ros...@gmail.com <mailto:andreas.ros...@gmail.com>> >>> wrote: >>> > >>> > Hello! >>> > >>> > I am an aspiring JDK contributor, having used Java in my work >>> as >>> > a developer. >>> > >>> > I was recently surprised by an Exception thrown when using the >>> > java.util.Arrays.asList() method >>> > so I would like to propose some improvements to this API. In >>> > particular: >>> > - When using java.util.Arrays.asList() then AbstractList is >>> > throwing UnsupportedOperationException which is not >>> > user-friendly or intuitive. >>> > - java.util.Arrays.asList() returning a private class called >>> > ArrayList, which is not the usual java.util.ArrayList, so it's >>> > not user-friendly or intuitive. >>> > >>> > Since this would be my first contribution to the JDK, and the >>> > goal is to complete the contribution with accepted pull request >>> > and get the Arrays API improved, what would the first step to >>> > making this first improvement to the JDK be? >>> > >>> > I would also like to share a link to an open source project >>> I've >>> > been working on: >>> > https://github.com/fciv-net/fciv-net >>> > <https://github.com/fciv-net/fciv-net> >>> > >>> > Thank you! >>> > >>> > Regards, >>> > Andreas R. >>> > >>> >>>