A big part of why I took the job with my current employer is for the opportunity to learn Java. They needed a skilled Perl programmer who also knew or was willing to learn Java. I guess the converse isn't true very often, a Java programmer who wants to know Perl.
Currently I am primarily modifying legacy perl code to interface with java servlets. This is done via http requests and posts. In my opinion it isn't exactly an efficient way of doing things but I don't really care as long as my code works. Funny thing is though that I can't really tell if it works. I ship data off to a servlet, but all I have got back so far are html pages with a java exception inlined in them. I actually have to trap the response content for an exception element because it doesn't return an http error code.
The writer of the servlet I am talking to has been in hell for the last week. His code has been complete and working fine up until a couple of weeks ago. At that time the deployment method for the java codebase changed along with a few things changing in libraries he depends on. As of now he is still unable to get his servlet to properly handle some operations. Java gets all pissy and exceptiony when running code built againt different versions of libraries. Since his servlet ends up depending on almost everything in existence, including third party libraries, he has been chasing exception after exception the entire time. He gets one issue fixed and finds another one deeper down the chain.
Unfortunately there doesn't seem to be a sane way to build the entire system and deploy it at this time. So part of his journey consists of documenting what he has done such that other people don't have to waste so much time doing the same thing.
This doesn't really affect me that much except that I can't finish testing my code. Well, I also have to periodically run my code in the debugger when he requests it so I can easily trap the http responses. The whole thing really just brings out in my mind just how sucky compiled languages are without without version independent library inclusions.
While waiting on my coworker to solve his configuration issues I have been working on a number of other things and doing research. Part of that research is familiarizing myself with java and with the eclipse ide. I have found a couple of really great java features so far. It does have the trinary ?: operator. This is one of my favorite shorthand ways of writing complex assignments. Not only is it shorter to write than declaring a variable, and then assigning it a value in an if/else clause, it has the side effect of irritating other programmers. That right there makes it a great language feature. I am frankly suprised that java included it.
Some stuff in java is incredibly obnoxious though. Printing is one of the primary features of a language. Having to specify 'System.out.println' rather than just saying 'printf' is needlessly irritating. When using a non-builtin type I think it is stupid that you have to declare its type then repeat it in the assignment constructor. i.e. 'StringBuffer searchMe = new StringBuffer("string of whatever");' There is no reason why the parser/compiler shouldn't be smart enough to default to StringBuffer's method new if the variable is of type StringBuffer.
Some things in the recommended coding style are just retarded also. Is 'x + y / 10' any less clear than 'x + (y / 10)'? If you don't know basic mathematical precedence then you probably shouldn't be writing code in the first place.
Having two different String types seems pointless also. If your mutable string class, StringBuffer, is too slow then maybe you should look at implementing it in a better way rather than coming up with another class, String, for constant strings.