advertisement

Article:
  Creating Varargs in Java 1.5 Tiger
Subject:   Are varargs an improvement?
Date:   2004-08-14 20:30:22
From:   MarcinJeske
I have read a number of articles and comments lauding varargs as one of the best new features in 1.5. I don't get it. They just seem to be a slight change of syntax and a change to coding style. Further, while they save some people a bit of typing, they introduce potentially elusive bugs (as noted in the excerpt).


I've never had a problem with supplying multiple arguments to a method in Java... I just use an array (hmmm... sort of like Java 1.5 does). So all varargs does is replace the [] with a NEW, SEMANTICALLY EQUIVALENT symbol, the ..., and save some typing for the method's clients:


foo(one, two, three)
instead of:
foo(new Object [] {one,two,three)


Worse yet, you have to remember to typecast arrays passed to vararg methods to avoid them being treated as the argument list... unless that's what you want.


Further, as opposed to explicitly using arrays, varargs can be used only once in the parameter list, at the end. (Also, I think the author alluded to another problem in the excerpt:
void foo(String x, String... list) {}
void foo(String x, String y, String... list) {}
foo("a","b","c");
where it is unclear which method to match and the compiler will return an awkward error. Using arrays would avoid this ambiguity.)


Also, using varargs could degrade coding style... and lead to mistakes which would have been caught as type errors using arrays.


Ex:
void sendMail( Person sender, Person... recievers);


sendMail( myself, reciever1, receiver2 );
sendMail( recevier1, recevier2 );


Both of those method invocation will compile and work, but one of them won't do the right thing (because we forgot the "sender" argument). The mistake would have been caught by the type system if the method had been defined as:


void sendMail( Person sender, Person [] receviers );
sendMail( myself, new Person [] {receiver1, receiver2} );


Finally, I want to say that I liked the style of the book, and am considering buying it... however, the editors might like to fix the manuscript up for the next printing, because at least in the excerpt, there are a number of places where the code doesn't seem to match the output, or where the '-' is used when a "=" should have been.


Best,
Marcin

Main Topics Oldest First

Showing messages 1 through 2 of 2.

  • Are varargs an improvement?
    2005-01-11 01:34:11  Krishnas [Reply | View]

    Let me give my comments.
    If you are seeing the Java 1.5 new features, ut will reduce the work for programmers rather than focusing on more functionality.

    But generics are realy amazing feature indeed.using enumerationa and varargs and static imports are minmize the code.
    Correct me if i am wrong.
    Thank you.
  • Brett McLaughlin photo Are varargs an improvement?
    2004-08-19 06:36:52  Brett McLaughlin | O'Reilly AuthorO'Reilly Blogger [Reply | View]

    Marcin-

    Thanks for your comments. I think it's true that varargs have been pretty heralded in Tiger. That said, I've always maintained (or tried to maintain) that they are more about convenience than functionality.


    I think what you'll find is that many Java programmers, especially ones for which Java is their first language, really aren't as comfortable as you might think with arrays. It's simply easier to works with Java collections. For these reasons, the idea of converting arguments to an array is a bit of a pain.


    And, I do think there are valid uses of varargs, like the classic max(int...) type of method. It really is a pain to throw ten or fifteen variables into an array just to call a method like this (max int[]), at least in my opinion.


    All that said, you're very much right that varargs can introduce a lot of hinky bugs. Like almost any new feature, it will probably be overused until some well-defined usage patterns develop. But, that's to be expected with new APIs :-)


    Thanks for your comments!


    -Brett McLaughlin