Java 1.5 had been a great, innovative release either of the language and platform. Sun's answer to Microsoft's C# 2.0. But not enough ... Microsoft delivered C# 3.0 so far with great features inside: enhanced initialization (type instances & collections), anonymous types and delegates, LINQ, lambda-functions ( == closures) ... As a developer, I'm really excited about those things. Many of them I would like to have in Java as well.
1) Collection initialization
Collection < int > integers = new ArrayList< int >() { 1, 2, 3, 4 };
ArrayList < int > list = { 1, 2, 3, 4 };
ArrayList < int > list = { 1, 2, 3, 4 };
2) Closures
This is a most wanted featured I guess. Any modern language has to support it. Groovy is very good complementary of Java with excellent language syntax tradeoffs.
db.eachRow( "SELECT * FROM uses" ) { user ->
// Do something here
}
// Do something here
}
3) Class initialization by property names
Employee employee = new Employee() {
FirstName = "Bob",
LastName = "Smith"
};
FirstName = "Bob",
LastName = "Smith"
};
4) Enhanced generics (parametrized types) support
Even Java 1.5 brings something like C# generics (which both are similar to C++ templates), the Java's implementation is the worst. It's my point of view.
// I would like to have something like this. Of course, it means that some
// type T has to have default constructor. C# uses constraints for that
// (like new()) so why Java doesn't?
class A<> {
private T t = new T();
};
// Why it's impossible to get the class of generic type parameter?
// Sure, taking into account that it's impossible for int, double, ...
// there're reasons for that behavior. Again, why don't we use constraints
// for that (like class)?
class A {
<T>void func( T ) {
Class< ? > t = T.class;
}
};
// type T has to have default constructor. C# uses constraints for that
// (like new()) so why Java doesn't?
class A<> {
private T t = new T();
};
// Why it's impossible to get the class of generic type parameter?
// Sure, taking into account that it's impossible for int, double, ...
// there're reasons for that behavior. Again, why don't we use constraints
// for that (like class)?
class A {
<T>void func( T ) {
Class< ? > t = T.class;
}
};
5) Default type value
int t = default( int );
Integer t = default( Integer.class );
Integer t = default( Integer.class );
Hope, Sun is going to thieve something from C# in put it to the Java. Will see ...