Having mostly worked with C#, I tend to think in terms of C# features which aren’t available in Java. After working extensively with Java over the last year, I’ve started to discover Java features that I wish were in C#. Below is a list of the ones that I’m aware of. Can anyone think of other Java language features which a person with a C# background may not realize exists?
The articles http://www.25hoursaday.com/CsharpVsJava.html and http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp give a very extensive list of differences between Java and C#, but I wonder whether I missed anything in the (very) long articles. I can also think of one feature (covariant return type) which I didn’t see mentioned in either article.
Please limit answers to language or core library features which can’t be effectively implemented by your own custom code or third party libraries.
-
Covariant return type – a method can be overridden by a method which returns a more specific type. Useful when implementing an interface or extending a class and you want an overriding method to return a type more specific to your class. This can be simulated using explicit interface implementation in C#, but there’s no simple equivalent when overriding class methods.
-
Enums are classes – an enum is a full class in java, rather than a wrapper around a primitive like in .Net. Java allows you to define fields and methods on an enum.
-
Anonymous inner classes – define an anonymous class which implements a method. Although most of the use cases for this in Java are covered by delegates in .Net, there are some cases in which you really need to pass multiple callbacks as a group. It would be nice to have the choice of using an anonymous inner class.
-
Checked exceptions – I can see how this is useful in the context of common designs used with Java applications, but my experience with .Net has put me in a habit of using exceptions only for unrecoverable conditions. I.E. exceptions indicate a bug in the application and are only caught for the purpose of logging. I haven’t quite come around to the idea of using exceptions for normal program flow.
-
strictfp – Ensures strict floating point arithmetic. I’m not sure what kind of applications would find this useful.
-
fields in interfaces – It’s possible to declare fields in interfaces. I’ve never used this.
-
static imports – Allows one to use the static methods of a class without qualifying it with the class name. I just realized today that this feature exists. It sounds like a nice convenience.
Java’s generics allow type wildcards. For example,
<T extends Object & Comparable<? super T>> T Collections.max(Collection<? extends T>) { ... }is not expressable in C#.