JWZ's rant "Java Sucks", is an excellent start:
I think Java is the best language going today, which is to say, it's the marginally acceptable one among the set of complete bagbiting loser languages that we have to work with out here in the real world. Java is far, far more pleasant to work with than C or C++ or Perl or Tcl/Tk or even Emacs-Lisp. When I first started using Java, it felt like an old friend: like finally I was back using a real object system, before the blights of C (the PDP-11 assembler that thinks it's a language) and C++ (the PDP-11 assembler that thinks it's an object system) took over the world.
But I know there are others. Though I'm not looking so much for complaints directed against Java Beans or AWT - I think everyone pretty much agrees that you can find crap libraries in any language. (Xlib, anyone?)
http://en.wikipedia.org/wiki/Java_criticisms is nice too, but a bit dry and toothless. I mean, a really good rant should not just make valid points, it should also be fun to read.
Am I remembering right that Gosling fairly recently said that had it to do again, he'd toss interfaces out of Java? (I found that very odd, since I think interfaces are one of the two best ideas in Java, along with built in serialization.)
So how about it? I know at least two good Java coders read my LJ. What are you guys' annoyances, pet peeves, and general sense of flaws in the Java language?
Or, more broadly, what features does a good language have? Off the top of my head, I think my most wanted list is...
- Reasonably simple syntax (If you can't read it, you can't maintain it.)
- Good support for modularity (Nothing specific here; I won't, for example, say that namespaces are a must-have. But some way to separate interface and implementation.)
- Reasonable support for generic programming (But please, NOT the way C++ did templates. Please!)
- Personally, I believe the time for garbage collectors has come (Though GCs are not yet perfect, and work remains to improve them.)
- Better safety than C, even if it means a small performance hit (Cyclone has this right - automatic bounds checks on all pointers unless you specifically tell it otherwise.)
- Compiled (Even if that means compiling in a very minimal VM)