Slashdot Mirror


User: arevos

arevos's activity in the archive.

Stories
0
Comments
1,303
First seen
Last seen
Profile
(view on slashdot.org)

Comments · 1,303

  1. Re:maybe to ruby, not python on Departure Of The Java Hyper-Enthusiasts? · · Score: 1
    An off by one brace error is a compile error in java, an off by one indentation is a run time bug in python. I've never seen a brace error reach runtime in java, but i've seen an indenting error in runtime python.

    I've this piece of code in Java source I inherited from a previous employee (or at least, a piece of code very similar in structure):

    SomePreviousLine = OfCodeWentHere(new thatWasTypicallyVery("Verbose").parse(stringName)) ;
    if (someCondition.equals(someOtherLongCondition) && booleanEvent && SomeOtherObject.methodName().equals(new Object()));
    {
    // Some equally long and complex javascript that inevitably overflows 80 characters in a very annoying fashion
    }

    It took me a while to spot the bug, especially since this particular delightful mess was embedded in hundreds of lines of similarly verbose code. The bug showed itself at runtime, not compile time, and you can imagine how hard it was to track down. Far longer, I suspect, than it would have taken me to spot a piece of code that didn't have the correct indentation.

  2. Re:Creating Java Objects on Departure Of The Java Hyper-Enthusiasts? · · Score: 1
    Both C++ and Java create objects this way for the same reasons. The syntax is important to basic OOP.

    Only to statically typed OOP. A minor distinction, but possibly worth mentioning.

    The reference "foobar" only knows what a FooBar object can do. This keeps us from doing SubFooBar methods that a SubFooBar2 can't do.

    You could just have the language default to using the type of the class called:

    // has type FooBar
    foobar = FooBar()

    // has type SubFooBar
    SubFooBar foobar = FooBar()
    The "new" operator is absolutely necessary. It tells the system to call a constructor function. Even Javascript has "new", and it is very weakly typed.

    It isn't necessary at all! C++ doesn't need the new operator to create a class, it uses only to distinguish between objects placed on the stack and on the heap. Java only has one memory location to put objects in, so the original purpose of 'new' is redundant.

    For instance, in C++:

    // Create a new FooBar object and put it on the stack
    FooBar foobar();

    // Create a new FooBar object and put it on the heap
    FooBar twobar = new FooBar();

    And in Python:

    # Create a new FooBar object
    foobar = FooBar()

    So the new operator isn't needed. It's pure fluff, designed to make C++ programmers feel at home.

    How would Java know that foobar = FooBar(); isn't a call to foobar = this.FooBar(); for the enclosing class? Don't say that it should guess that an undefined method is a constructor!

    You'd just putting classes and methods in the same namespace, of course. Since classes are meant to start with an uppercase character, and methods with a lowercase letter, you wouldn't have any clashes if you're naming things correctly. I mean, how often, really, would you create a method called "Object", or a class called "toString"?

    Besides, when you think about it, what's so special about a constructor anyway? All a constructor is, after all, is a method that returns a new object. Big deal. Any method can return a new object - just look at Class.newInstance or the singleton pattern. So why make an artificial distinction in syntax between constructors and methods?

  3. Re:A Humble Note on Departure Of The Java Hyper-Enthusiasts? · · Score: 1
    It just goes back to the fact that in Java, as in many languages, you have to declare your variables; Your example looks more like a scripting language where declarations are not required (e.g. Javascript).

    And how am I not declaring them? I mean, if you want to be really explicit about it, you could add in a keyword:

    var foobar = SomeCustomClassName()

    Which would both be easier to recognise as a declaration, and shorter to type. Though this isn't strictly necessary, I concede it could help prevent look-alike errors.

  4. Re:A Humble Note on Departure Of The Java Hyper-Enthusiasts? · · Score: 1
    Thats up to you and the context the object is being created in.... ArrayList list = new ArrayList(); List list = new ArrayList(); Collection list = new ArrayList(); all create a new ArrayList and assign it to 'list'. Defining an object's type by its interface, if available, is more flexible than defining it by its concrete implementation. while a bit verbose in some cases, I think it adds to the extensibility of the language and is not a drawback.

    It would be just as easy to make the type optional, instead:

    a = Vector<String>()
    List<String> b = Vector<String>()

    "a" takes the default type of a Vector, whilst "b" takes the List type instead.

  5. Re:I've moved on to python but it sucks in many wa on Departure Of The Java Hyper-Enthusiasts? · · Score: 1
    However, the "pythonic" philosophy of "anything is allowed if you try hard enough could be re-termed "moronic". It's just bad design to have multiple ways of doing the same low-level thing in a language. Complexity multiplies, as we all know.

    Um, the Python philosophy is supposed to be completely the opposite. To paraphrase: "There should be one, and preferably only one, obvious way to do it."

    Where do you feel Python falls down in this department? Could you give an example?

  6. Re:maybe to ruby, not python on Departure Of The Java Hyper-Enthusiasts? · · Score: 1
    Whitespace errors can occur far more easily than block delimiting errors.

    Not in my experience. At a guess, I'd say you haven't programmed in Python much. How can you make such an assertion when you have little to no practical experience working with a whitespace-using language like Python?

    I have over two years experience working in Python, and longer working in Java. Throughout this time, I've had less than a dozen whitespacing errors, and all of these were due to switching from using tabs to spaces for indentation in my editor. I've had at least ten times more semicolon and bracketing errors in that same period.

    Consider the case of un-indenting one line too soon. That produces an if condition error in python. Consider failing to close a block in java: that produces a compile time error.

    Er, no it doesn't. If the whitespacing is incorrect, it produces a compile time IndentationError in Python.

  7. Re:VB for the 21st Century on Departure Of The Java Hyper-Enthusiasts? · · Score: 1
    I hope nobody takes this the wrong way, but both Python and Ruby seem to be "VB for the 21st Century" -- as in tools to build quick-and-dirty apps without all that annoying type safety. In other words, they don't really directly compete with Java at all.

    It's worth remembering that until 1.5 came out, even Java didn't have complete type safety.

    It's also worth remembering that static typing comes at a cost. A dynamic typed language can do things that a static typed language simply cannot. Mutable classes and objects are not uncommon in Python, and this is not just because the programmers just felt like it; there are significant benefits to using these tools.

    For instance, in database abstraction layers such as the one in Rails, and SQLObject in Python, make heavy use of this mutability to create an largely transparent SQL interface. Java's static typing prevents it from doing the same.

    Ruby and Python sacrifice a safety-net for greater power. You may think this is a wise decision, or you may not. But I don't think you can compare this philosophy to VB, which has all the power and flexibility of a dead fish.

  8. Re:A Humble Note on Departure Of The Java Hyper-Enthusiasts? · · Score: 1
    Java is one of the first languages that was well planned and well designed with a theoretical basis in mind.

    And yet Java sure does a good job looking like it was a bodge stuck together from broken bits of C++. Why would you design a language where you need to write this:

    FooBar foobar = new FooBar();

    Instead of this:

    foobar = FooBar()

    Why do you have to write the type twice? And what's the point of the new operator, anyway? In C++ it distinguished between objects to be placed on the stack and objects to be placed on the heap. In Java it appears to be there only to add in an extra layer of redundancy. How is this "well planned"?

    Add this to the abysmal system of casting to retrieve objects from Lists and Maps, a problem that has only recently been fixed in 1.5, and you're really descending into the soup of bad design. Why the hell would you go to all the trouble of ensuring type correctness with static typing, and then ruin it by having to rely on casting? The disadvantages of static and dynamic typing in one language! Again, how could this possibly be considered "well planned"?

    One need only look at the amount of hacks (*coughs* getClass *coughs* getConstructor *coughs* autoboxing) created to get around Java's incomplete object model to realise how little the originally developers planned things out.

  9. Re:Python hype does not exist on Departure Of The Java Hyper-Enthusiasts? · · Score: 3, Interesting
    The lack of information hiding makes it very hard to ensure that fellow programmers use your classes in the way intended (and before anybody says "a good programmer will do what your comments say, so fire the people who just use the code they see" - shut up, it is not possible to hire a team of all super-diligent programmers)

    You could look at it the other way round; if there's a mistake in a Java class, you can't easily work around it. And I can think of two recent incidents where this has been the case for me.

    The speed issue is a factor, but I personally can't see why anyone would prefer Java over Python for developing commercial projects. Java's limitations are pretty frustrating sometimes, and there are times when you need to copy-and-paste segments of Java that could be avoided in Python. Java's simplistic and long-winded syntax means you have to do things the long way more often than would be convinient.

  10. Re:maybe to ruby, not python on Departure Of The Java Hyper-Enthusiasts? · · Score: 2, Informative
    Pythons syntax relies on whitespace rather than closure for depth management. It's foreign to a sufficient number of programmers to represent a real bug risk, particularly as you try to grow toward building large programs.

    Eh? That's like saying languages that have semicolons on the end of lines are more bug-prone because programmers sometimes forget a semicolon. Incorrect whitespacing and missing semicolons are both syntax errors that are caught at compile-time, not run-time, so in practise this is entirely a non-issue.

    Despite having twice as many years experience programming Java than Python, I've found that Python's whitespacing is far less prone to error than other methods of block delimiting. I can count the number of times I've messed up my indentation on the fingers of one hand. The number of times I've missed the occassional semicolon or bracket must number in the hundreds.

  11. Re:Ruby on Rails creeks of immaturity on Is Ruby on Rails Maintainable? · · Score: 1
    For example any real enterprise application requires end to end transaction support. Does ActiveRecord handle that? What if the transaction is distributed across systems like mainframe 3270 terminals, couple of web services and some database access? I'm sure doing this in RoR would be much harder and probably take more code than doing it in robust enterprise frameworks like J2EE.

    This may come as a shock to you, but most websites don't need a mainframe of 3270 terminals to run. I know, I know, it's as much as a surprise to me as it is to you. I even hear that one can create a commercial website for under a million dollars, these days! What will they think of next? Maybe home users will have websites next!

    The point I'm not-so-subtly trying to make is that enterprise-grade, million dollar web applications that handle a kazillion hits a day aren't actually that common. It's true that Rails isn't going to create the next Google, but there are websites out there which don't have to handle hundreds of gigabytes of traffic per day. Ruby isn't designed for the enterprise. It's designed to run small to middle-sized web-applications, such as 43 Things or Penny Arcade. And sites like these make up the majority of the net, whilst web applications suited for "enterprise use" are in a considerable minority.

  12. Re:This movie will be a guaranteed blockbuster on More Delays for Ender Movie · · Score: 1
    Look, its great that you live in a pacifist country like Britian *cough* FALKLANDS *cough*

    I'm sure there are better examples than the Falklands. As I recall, that involved a democracy defending its (admittedly remote) territory from a dictatorship.

  13. Re:Bittorrent for the win... kinda on P2P Population Growing Again · · Score: 1
    That's not a simple problem you can blame on any single entity. The only true solution will be to complicate ISP pricing schemes with the option for higher-priority, more expensive packets.

    Or lower the contention ratio.

  14. Re:Perl? Are you kidding me? on Larry Wall on Perl 6 · · Score: 1, Offtopic
    Basically, perl is like Emacs or the CLI: it's a cult.

    Whilst I agree with you generally, why did you consider the CLI to be 'a cult'? And to which CLI do you refer? Bash has its deficiencies and irregular syntax, but I don't know of anything better. Do you?

  15. Re:Bittorrent for the win... kinda on P2P Population Growing Again · · Score: 1
    Of course, all that bulk data transfer is going to ruin the latency for anyone trying to make a VoIP call in a way that even traffic shaping can't.
    Only if the contention ratio is sufficiently high, and the bandwidth of the ISP pipes is sufficiently low. And if that is the case, you wouldn't want to use that ISP for VoIP anyway.

    Besides, if you're paying for a bandwidth of X, why should you use less just because the ISPs can't keep up with demand? Surely its the ISP's fault for trying to provide a service it is incapable of delivering?
  16. Re:Experiment Proposal on Chimpanzees Beat out Children in Reasoning Test · · Score: 1
    Bzzzzt, I'm sorry, I am arguing that humans and chimps evolved a survival strategy that we call war. This strategy is significantly different to other animals and is what I called "violence". Perhaps I confused you when I defined war as "violence" to distigush the behaviour from the background gnash of tooth and claw?

    Uh, yep, that's what confused me. Google defines violence as "an act of aggression"; given this meaning, I thought you were arguing that humans were somehow more cruel or aggressive than other animals. If you were trying to say that humans are more efficient at being violent, I'd have to agree. But perhaps you could be a little clearer in your assertions? Redefining the meaning of common words isn't the best way to clarify your point.

    War has always been a part of us and I belive it is an evelotionary trait unique to great apes. War is not just lion behaviour with more technology.

    I'm not so certain about this. War can occur when there is there is a good chance of eliminating your opponent without sacrificing yourself. Lions don't possess this ability; two adult lions fighting is risky for both. The ability to think as a group is perhaps the main thing that leads to war, but tools certainly make it easier. Perhaps war is lion behaviour with intelligence.

    But when applied to survival problems humans look more like a flash in the pan.

    It's a rather bright flash, though, isn't it? In the time humanity has been around, it's been considerably more successful, in terms of passing genes on to the next generation, than octopuses have. We've eliminated two potential methods of extinction; it's rather unlikely humans are going to become extinct because of competition for food or through the act of predators. It's becoming less probable we'll destroy ourselves, which is another method of extinction. All that remains is disease, which we're making significant progress against, and extraterrestrial threats such as asteroids. Whilst we've only been around for a brief time, we've done considerably more to secure our continuing survival in that time, than octopuses have in theirs.

    Human brains are an intricately woven blob of neurons that individually follow a set of mindless rules. Both the ant and the neuron have evolved to co-operate, co-operation on the "mindless" level emerges as intelligent behavior on the "mindfull" level.

    Whilst true to an extent, the communication channel that ants use is extremely limited. A human mind has a thousand times as many neurons as the largest ant nest, and each neuron communicates with the next with far over a million times as much information as one ant can impart to another. Ants possess a degree of collective intelligence, yes, but it's an extremely limited intelligence, due to its distributed nature.

    And whilst we're talking about collective intelligence, what about the collective intelligence of humanity itself? We, like ants, live in large societies of many thousands of individual organisms, though our communications channels and processing abilities are some million million million times greater than an ant colony. This is why I don't think that octopuses and ants have intelligence that is comparable to humans; even considering that these creature's intelligence has a different architecture to humans, we just have too much resources and bandwidth for these creatures to be thought of on an equal level.

  17. Re:So, now that you're... on Ruby on Rails 1.0 Released · · Score: 1

    Difficult choice there. As you say, they're all good in their own ways.

    However... overall, for commercial purposes, I'd personally be tempted by Ruby on Rails. I'm a Pythonist at heart, but Rails has several things going for it:

    1. Popularity and recognition.
    2. Code generation that gives you a good starting point from which to develop your application. This can save quite a bit of time.
    3. Maturity. At version 1.0, Ruby's pretty darn stable and well documented.

    In addition, Ruby is a powerful language. More so than Python (though not by much), and certainly more than ASP.NET. This again is another thing in Rail's favour. Not only will does it open up your options, but it also expands your knowledge as a programmer.

  18. Re:Experiment Proposal on Chimpanzees Beat out Children in Reasoning Test · · Score: 1
    You should take comprehension lessons if you read that in my posts. Like humans, lions behaviour has evolved they did not choose it.

    Pardon me, but what's that got to do with the debate at hand? You appear to be arguing that humans and chimps are significantly more violent and cruel than other animals, and hold up the concept of war as evidence of your claim. I point out that animals do not war because they lack the capability, not the will to do so. As evidence, I point out that many animals kill members of their own species, especially young. Further, I argue that cruelty and violence are valuable survival traits.

    An ants nest is a nice example, so is an octopus

    Ants do not imploy intelligent behaviour; they employ efficiently stupid behaviour, and this is a very successful tactic. The internet too, employs efficient stupidity. Internet routers, like ants, are unintelligent and follow a set of mindless rules. However, when in a swarm, these rules become very effective. But just because these rules are effective, doesn't mean intelligence is at play.

    Octopuses are intelligent, but only compared to most other animals. Compared to humans, the their intellect is a flickering candleflame compared to the nuclear brightness of humanity. Even the most moronic human far outstrips the capabilities of an octopus, and humanity has the capability to pool its intelligence and knowledge across vast distances of space and time. An octopus has to think alone, whilst a human has a good majority of their species to stand upon.

  19. Re:Experiment Proposal on Chimpanzees Beat out Children in Reasoning Test · · Score: 1
    You accuse me of being naive, I would say say you have a narrow view of intelligence. If you change the above to read
    ...Animals with non-human-like intelligence do not war because it is detrimental to THEIR species"...
    then I think we understand each other.

    The Lion King is not a substitute for a basic knowledge of biology. Animals do not try and preserve the environment; they try to exploit it to ensure their survival.

    Further, an event which is detrimental to a species, is not necessally detrimental to individual animals. If half the members of a species die, then more food is available for the remaining half. The only downside to mass extermination of your own species, from a natural selection point of view, is the difficulty finding a mate. And that whole safety in numbers thing for animals that rely on such a tactic

    And what with this whole "non-human-like intelligence" rubbish?

  20. Re:Experiment Proposal on Chimpanzees Beat out Children in Reasoning Test · · Score: 1
    It makes sense for a species to kill it's members off? Sheesh only a human or a chimp would say that. (Granted a nest of ant's may protest with single minded determination).
    The other animals you mention are either defending territory or display fighting for breeding rights, both serve to strengthen the species, neither aim to kill.

    This is a very naive and incorrect assertion. Have you never watched a wildlife documentary that involves packs of predators? When the dominant male of a lion pride is usurped, the cubs of the pride are often killed by the new male. This is not unusual behaviour.

    Why this occurs is, as I said before, just evolutionary common sense. An animal not only competes with other species, it also competes with its own species. Killing off its competitors is a neat way of ensuring that it has more food and a wider choice of mates.

    But things aren't that simple. If an animal is wounded in a fight, then they are at a significantly greater risk of later being killed. Wounds can become infected, or cripple them long enough to starve. Killing a rival may be a hollow victory if the rival manages to get a lucky hit in. Hence the need for displays and threats.

    Baby animals are a much easier target. If they are parted from their mother, then they can be killed without risk of harm to the killer. This is why baby-killing is so popular amongst many animal species. It's an easy way of ensuring your own offspring are more likely to survive.

    Chimps and humans are intelligent enough to develop tactics beyond this. Two rival animals squaring off against each other have a lot to lose; all their eggs are in one basket so to speak. If they get wounded too badly, they could very well die later even if they win the fight. But if a family group manages to isolate a individual rival, then suddenly it becomes cost effective to kill said rival. Animals with less intelligence do not war because they lack the capability, not the will to do so.

    The natural world rewards those animals who can survive, no matter how cold or cruel their methods of survival are; ruthlessness is a good survival trait. We are the products of billions of generations of the most strongest and most ruthless animals that survived only by trying every dirty trick in the book to screw their competitors out of a meal. Considering most of our distant ancestors were complete and utter bastards, I think we've done rather well at the whole peace and love dealy.

  21. Re:Can anyone offer a contrast to Gears and Django on Ruby on Rails 1.0 Released · · Score: 3, Interesting

    I've briefly looked at all three frameworks, and here are my impressions:

    Turbogears is made up of separately developed components; CherryPy for the controller and HTTP server, SQLObject for database modelling and Kid for templating. Turbogears is pretty similar to RoR, but has less automation, and has a more Pythonic and component-based approach to development. Sometimes it's a little obvious that the components were created separately

    Django is more like Rails, but is somewhat more specialised. If you want to create a site with an administration section, then Django does a lot of the work for you. Beyond that, Django stacks up pretty equally against RoR.

    Both these frameworks are Python based, which again results in some differences. They may be easier to learn, but may lack a little of the flexibility that Ruby boasts. Ruby doesn't have many features that Python hasn't, but it does have some.

  22. Re:Java not flexible?! on Java Is So 90s · · Score: 1
    An interface also lends itself to a much more loosely coupled relationship, since the interface will very rarely change, and the classes that depend on the interface know absolutely nothing about the internal workings of the actual implementation, so the particular implementations can be mercilessly refactored as necessary. The same can't be said about abstract classes, unless they have so little implementation that they're essentially interfaces in every way but name.

    I'm sorry, you've lost me. Interfaces are a subset of multiple inheritance. With multiple inheritance, you have the choice to use an interface-like abstract class, or not to use one. Java does not provide this choice, which sometimes leads to code being repeated across classes. How can removing choice from a language be a good thing, especially when this breeds redundancy?

    Your criticisms also do not really seem to me to get at flexibility so much as expressiveness and the undeniable fact that some things are much more difficult to express in Java than, for example, in a language that has higher-order functions (like Nice in the broader jvm world) (though anonymous inner classes (another use for interfaces, in simple callbacks and the like) go a long way to substituting for them, and after using them for a while they don't seem awkward to me anymore).

    Java's immutable classes are certainly a very real point of inflexibility, and are not just a lack of expressiveness.

    However, in theory, you are correct that higher-order functions and the like are examples of expressiveness rather than flexibility. Java can achieve the same thing, even if in a more long-winded manner. In a similar way, a car doesn't provide anymore flexibility over walking; it's just faster.

    But in practise, it does provide a barrier to flexibility. A car opens up options not available to a pedestrian. Whilst a five mile trip is possible by foot, such journeys are not often practical. In a similar way, the weight of anonymous objects is a barrier to them being used in the same way as, for instance, Ruby's blocks.

    In Ruby, blocks are used everywhere. In Java, anonymous objects are used very rarely. Yet both these constructs are, in essence, much the same thing. So whilst in theory, Java is just as capable as Ruby when it comes to higher level functions, in practise Java lags behind due to the weight of its syntax. In my view, this counts as a lack of flexibility, though you may see it differently.

    The richness of the libraries and frameworks that are freely available to the average Java developer is astounding.

    Oh, certainly, and this is one of the reasons why I'd be tempted to use Java in some circumstances. This said, there are some rather good libraries for other languages that Java doesn't come close to matching. Rails and Twisted are the first two that spring to mind.

  23. Re:Experiment Proposal on Chimpanzees Beat out Children in Reasoning Test · · Score: 1
    Humans and chimps are the only animals that group together to systematically kill the members of a competing group over an extended period of time, for no particular reason other that they can.

    Perhaps the reason that these animals are systematically killing the competing group is because, and I'm going out on a limb here, that they're a competing group.

    Generally speaking, it makes evolutionary sense to kill animals of your own species that aren't part of your immediate bloodline. The majority of predators, and even some herbivores (such as hippos) do this. Chimps and humans are merely the only creatures with the intelligence and means to effectively apply this strategy on a grander scale.

  24. Re:Java not flexible?! on Java Is So 90s · · Score: 1
    In my mind LAMP is Linux, Apache, MySQL, Perl (I've spent most of the past 5 years working in perl) and i'd argue that Java has a far more complete OM than perl does.

    Oh, certainly. Perl's entire object model is a bolted-on hack :)

    Python and Ruby, on the other hand, have a much better object model. Everything, including classes, methods and imported modules are objects, and can be treated as such. Java lacks this, but partially makes up for this by suppling a vast number of wrapper objects: classes can be wrapped in the Class object, methods can be wrapped in the Method object; but Java's wrappers are very clumsy in comparison to the real thing.

    I'll give you the introspection is needlessly complex and that autoboxing is something of a hack, but I feel interfaces are very useful and perhaps more-so than multiple inheritance. Of course Java was my first real-world experience of OO programming, so i may view it differently just because i'm not very used to working with C++.

    Certainly the languages you know affects how you view programming, though multiple inheritance done properly is a superset of interfaces. Anything you can do with interfaces, you can do with multiple inheritance. An interface is, after all, just an abstract class with no variables.

    However, to get back to the original point, I felt that java was very flexible in terms of end result. I can think of loads of things i can't do in visual basic without resorting to some nasty hack. OTOH the only thing, that springs to mind, that i've had trouble with in Java was getting a servlet to accept a large (8GB) file encoded in an HTTPS post. Perl had no qualms about it.

    Certainly Java is better than VB, and easier to read than Perl. In that, we are in complete agreement :). But Python and Ruby, at least to me, seem significantly better again.

    You might also want to check out Nice. It's a language that compiles into JVM bytecode, the same as Java, and can use Java classes (Groovy and Scala are some other interesting JVM-based languages). Nice looks a lot like Java, but boasts some pretty interesting advantages, which are listed on the front page of the website. Multi-methods, value dispatch and anonymous methods are my favourites :)

  25. Re:Java not flexible?! on Java Is So 90s · · Score: 1
    Where do you feel java lacks flexibility?

    While I'm not the parent poster you're replying to, I'll try and answer this. Of course, it's a little tricky to know where to begin!

    The most obvious thing that springs to mind is that Java lacks true multiple inheritance and a complete object model. To try and compensate for these deficiencies, hacks such as interfaces, autoboxing and a variety of object wrappers have been patched in. This leads to redundancy and unneeded complexity.

    Flexibility is sacrificed for robustness with Java's use of static typing, though you may feel that's a justified sacrifice. Java also lacks operator overloading and anonymous methods (ie. lambdas). Anonymous objects are nice, but terribly clumsy. Java doesn't have metaclasses like Python, continuations like Ruby, or duck typing like Boo. You can't redefine existing classes and Java's introspection is horribly complicated compared to other languages.

    I'm sure there's more, but that's all I can think of off the top of my head. The current project I'm designing at work is in Java, and the code would be a lot neater and shorter if I had multiple inheritance, simple introspection and anonymous methods.