Dan

I'm happy with generic lists except in one case, where I am simply passing in a list of parameters. Here there no reason for the extra work the programmer has to do and the code reader subsequently has to read. In these cases - and it applies particularly to requests made to the meta model to do something.

At the moment I can't think of any reasons not to get rid of the array parameters, but the replacements should be a var-arg or a List. In particular var-arg should be used when you would have had a reference parameter if there was only one instance, eg if all methods invoked reflectively only had one parameter.

Regards
Rob

On 20/12/10 08:35, Dan Haywood wrote:
Hi Rob,


On 19/12/2010 21:18, Robert Matthews wrote:
Should we replacing all arrays with lists?
Yes, I think so.  Lots of reasons:
- lists can be made immutable, which will reduce defects (in fact, I'd like us to get to evolve the metamodel APIs so that they are fully immutable) - lists correctly support covariance/contravariance, whereas arrays do not (ArrayStoreException anyone). - list lets us change the implementation (ArrayList vs LinkedList or some other mechanism) whereas an array exposes its "implementation" - lists can be decorated, eg made thread-safe (Collections.synchronized*())
- lists are a higher level of abstraction compared to arrays

There's also pragmatic reasons:
- with google-collections there is great support for processing lists in a declarative way (eg apply a Function to transform). - just compare appending one list to another (list.addAll(otherList) vs the huge amount of code needed to do the same thing with arrays)
- lists can grow in size, which simplifies the code

Others think so too:
- Josh Bloch, in Effective Java (item 25); see [1]
- javapractices.com [2]
- these responses on stackoverflow [3]

To answer your points:

1) A simple statement like

ObjectAction action = spec.getObjectAction(ObjectActionType.USER, "userFor", new ObjectSpecification[] {userid.getSpecification()});

becomes

List<ObjectSpecification> parameters = new ArrayList<ObjectSpecification>();
                parameters.add(spec);
ObjectAction action = userAdminService.getSpecification().getObjectAction(ObjectActionType.USER, "userFor", parameters);

Which is not much of an improvement!

or just:
ObjectAction action = spec.getObjectAction(ObjectActionType.USER, "userFor", Arrays.asList(userid.getSpecification()));

which is actually shorted than the array equivalent!


2) If that was the right thing to do then java.lang.reflect.Method would have the following method

    Object invoke(Object object, List<Object> parameters)

to replace

    Object invoke(Object object, Object[] parameters)

but it doesn't.  My Java in a nutshell says it has this instead

    Object invoke(Object object, Object... parameters)

which is an array by another name.

Well, there are lots of APIs from Java 1.0 that aren't the best (java.util.Date, anyone?).

In general the java.lang.reflect does use lots of arrays, you are right, (eg Class#getDeclaredMethods() returning Method[]), but I think that's because they wanted typesafety and generics didn't exist.


3) The Java people haven't suggested removing arrays from use so they must be good for something.

Well, they've never removed anything....

It's fine as an underlying data structure (after all, ArrayList is backed by an array), but it isn't appropriate for API.


Maybe (2) is a clue as to how we should be handling these situations where all want to do is pass in a set of somthing.

Regards
Rob


I think the original reason you probably because of their typesafety (covariance issues aside). However, generics mean that isn't a factor anymore.

In general, I want the API for Isis to evolve and keep pace with recognized best practice, eg being immutable wherever possible. I truly think that doing this will help us build community; so that a casual would-be user will browse our API and "grok" it immediately. This is just one step along that journey.

I'd be interested in other opinions here; we have lots of experienced Java guys here. Mark, Sigi, Nour, Kevin, Dave, Alexander, Mike, Sabine, Vango, anyone else listening in ... what say you all?

Cheers
Dan

[1] http://books.google.co.uk/books?id=ka2VUBqHiWkC&pg=PA119&lpg=PA119&dq=java+prefer+lists+over+arrays&source=bl&ots=yXLhQhqZRZ&sig=bCY4OyUfzvgE17-l2HEHbi5cGyA&hl=en&ei=HBEPTfCtDJO6hAf274i3Dg&sa=X&oi=book_result&ct=result&resnum=7&sqi=2&ved=0CEYQ6AEwBg#v=onepage&q&f=false
[2] http://www.javapractices.com/topic/TopicAction.do?Id=39
[3] http://stackoverflow.com/questions/2391553/why-is-it-preferred-to-use-lists-instead-of-arrays-in-java [4] http://stackoverflow.com/questions/1589813/when-to-use-a-list-over-an-array-in-java


Reply via email to