Erroneous JavaDoc for Path#register
Matthias Ernst
ernst.matthias at gmail.com
Thu Dec 4 07:45:18 PST 2008
[moved from my duplicate thread]
When you have good Set creation methods, i.e. EnumSet, then that would
be a good option IMHO. Or nio could offer these if java.util doesn't
get it done. Arrays should go away.
new HashSet<Type>(Arrays.asList(a, b, c)) is however not an option.
Regarding the generic array problem: if I'm not mistaken, you're safe
with <?> . It is trivially always typesafe and the compiler shouldn't
warn.
Matthias
On Thu, Dec 4, 2008 at 4:23 PM, David M. Lloyd <david.lloyd at redhat.com> wrote:
> On 12/04/2008 02:45 AM, Matthias Ernst wrote:
>>
>>
>> http://openjdk.java.net/projects/nio/javadoc/java/nio/file/Path.html#register(java.nio.file.WatchService,%20java.nio.file.WatchEvent.Kind[],%20java.nio.file.WatchEvent.Modifier...)
>>
>> Barring any language changes I missed, the example code does not
>> compile. It requires an explicit array creation, not?
>>
>> WatchKey key = dir.register(watcher, new WatchEvent.Kind<?>[] {
>> ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY
>> });
>>
>>
>> Given that there are no modifiers defined as of today and I would
>> expect them to be empty most of the time (that's why they're called
>> modifiers), wouldn't it be nicer if the two parameters were switched?
>
> Unfortunately, if you have a varargs method parameter which is of a generic
> type, you'll generally get an annoying compile-time warning stating that
> you're implicitly creating an array of generic type. On the other hand, the
> second parameter actually is an *explicit* generic array creation, so...?
>
> Perhaps it would be better if both of these parameters were Set<> types like
> this:
>
> public abstract WatchKey register(WatchService watcher,
> Set<WatchEvent.Kind<?>> events,
> Set<WatchEvent.Modifier> modifiers)
> throws IOException;
>
> This way, one could take advantage of EnumSet by creating enums to implement
> each interface for a particular provider. E.g. the standard events class
> "StandardWatchEventKind" could become:
>
> /** Typed in an email client, forgive egregious errors */
> public class StandardWatchEventKind {
> enum PathKind implements WatchEvent.Kind<Path> {
> // I have no idea if these are the proper names. Just for
> illustration...
> ENTRY_CREATE("create", Path.class),
> ENTRY_DELETE("delete", Path.class),
> ENTRY_MODIFY("modify", Path.class),
> ;
> private final String name;
> private PathKind(String name) {
> this.name = name;
> }
>
> public String getName() {
> return name;
> }
>
> public Class<Path> getType() {
> return Path.class;
> }
> }
>
> enum VoidKind implements WatchEvent.Kind<Void> {
> OVERFLOW("overflow"),
> ;
> private final String name;
> private VoidKind(String name) {
> this.name = name;
> }
>
> public String getName() {
> return name;
> }
>
> public Class<Void> getType() {
> return Void.class;
> }
> }
>
> // Not strictly necessary but maybe desirable?
> public static PathKind ENTRY_CREATE = PathKind.ENTRY_CREATE;
> ...
> }
>
> Then one could use EnumSets for watch event kind sets that are all of a type
> (which seems like it would be a common situation, no?), and a plain HashSet
> otherwise.
>
> - DML
>
More information about the nio-dev
mailing list