On Feb 7, 2008 8:10 AM, Stephen Colebourne <[EMAIL PROTECTED]> wrote:
> Niall Pemberton wrote:
> >>> [Note CharSequence replaces String and/or StringBuffer flavours]
> >
> > OK for the above I added new methods, rather than changing the method
> > signature - so still compatbile atm:
> >    http://svn.apache.org/viewvc?view=rev&revision=619188
>
> Although, the API is now bigger. If we decide to break binary
> compatibility later, we need to remember to delete duplicates like this.
>
> >> All the other changes are binary compatible. Except for the problem that
> >> the bytecode format for Java 5 is different as well, so you'd need
> >> retrotranslator to help you out as well.
> >
> > Anything that depends on a JDK 1.5 IO version will have to also be
> > minimum JDK 1.5  and therefore direct or indirect users must be
> > running on JDK 1.5 - so I don't see any need for retrotranslator or
> > issues for users. Have I missed something?
>
> Hmm, yes we should be OK.
>
> >> In addition to the changes above, you will probably want to change most
> >> APIs that take in a Collection to take an Iterable instead.
> > OK I just had a quick scan and it looks we have the following methods
> > where we could do this:
> >     FilenameUtils.isExtension()
> >     FileUtils.convertFileCollectionToFileArray()
> >     FileUtils.writeLines()
> >     IOUtils.writeLines()
> > but this could also be done by just adding new flavours with an
> > Iterable, rather than changing the existing methods.
>
> Agreed, additional method can be added. Its certainly not as neat as
> just one method, and deprecation won't help (as any code linking to [io]
> will always pick the method taking a Collection, until the method is
> removed - hence removing the deprecation will never really be possible).
>
> >> We should probably remove all references to arrays in the public API, as
> >> generics and arrays work badly together, and I would strongly recommend
> >> treating arrays as a type not to be exposed on any public API post-Java5.
> >
> > Perhaps you could expand more on this because I don't see a big issue
> > for IO. - are you thinking along the following lines:
> > http://www.tbray.org/ongoing/When/200x/2005/06/12/Comparable
>
> Kind of. Arrays and Generics do not work well together. One example is
> passing a generified list to a vararge method:
>   public void process(List<String>... values)
> This will always generate a warning, as the list gets converted to an array.

OK I'm not convinced by this. "Arrays and Generics do not work well
together" is a big generalization and your example doesn't relate to
arrays - from this you could say "varargs and Generics don't work well
together" so lets not use varargs in IO, but I don't see how it
relates to arrays.

How about Commons IO examples:

1) NameFileFilter has both String[] and List constructors:
  public NameFileFilter(List<String>)
  public NameFileFilter(String[])

IMO this provides choice for the user - how would removing the
String[] constructor benefit the user in any way?

2) I guess the other side of the equation is where we return an array,
there doesn't seem many cases of this, a quick scan showed these:
    - FileUtils.convertFileCollectionToFileArray()
    - FileUtils.readFileToByteArray()
    - FileUtils.toFiles()
    - FileUtils.toURLs()
    - IOUtils.toByteArray()
    - IOUtils.toCharArray()

Most seem appropriate, but perhaps toFiles() / toURLs() could return
an Iterable - but I could just as well envisage unhappy users who
prefer getting an array - better in that use case to provide two
flavours of methods so that the user can choose.

> In general, arrays work poorly with generics, to the point that you
> can't avoid the warnings. My recommendation would be to replace arrays
> in the API with Collection/Iterable/List as appropriate. Existing API
> users can easily adapt, and they will thank us for the lack of warnings.

I think you need to make a better case for this kind of policy.

Niall

> Stephen

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to