Basically, I am quite happy with Java, exept it could have a little more syntax shortcuts.
?. and !.An operator which would return null or 0 if a
NullPointerException, resp. Throwable, would occur
when computing expression's value.
// val will be 0 if getMap() or getKey(String) returned null.
int val = unreliableMapProvider.getMap()?.get("key")?.getName();
One use case: Logging performance.
log.info()?.log( timeConsumingCall() ); // ... instead of ... if( log.isLoggable(Level.INFO) ) log.info( timeConsumingCall() );
Of course there's much more use cases, I bet you could find many in your code.
Writing ((Type)something).useItAsType() is very boring. How
about this:
Programmer prog = getJavaProgrammer(); String anwser = prog.cast(JavaProgrammer).askAboutJava();
Combined with the above operator, answer would be null if there
was a ClassCastException:
String anwser = prog.cast(JavaProgrammer)!.askAboutJava();
instanceofThe compiler should look for the following usage of instanceof
and consider the variable as being of the checked type:
if( myObject instanceof String ){
// No more redundant casting.
myObject.length();
// As myObject is now treated as string, this would cause a compiler error:
myObject = new Integer(5);
}
Writing and reading getters and setters is the worst annoyance on Java. Except web developement, they are seldom used for custom behavior, anyway.
I like how it's done in C#. I'd do it similarly in Java.
* Declaring a public property automatically creates default
getters and setters too.
* Declaring a private property creates no get/setters.
* Declaring a readonly property creates a public getter.
* Getters and setters are overridable.
Of course, closures… so instead of
interface RainListener {
void itsRaining();
}
public void announceRain ( RainListener lis ){
lis.itsRaining();
}
public void testRain(){
announceRain(
new RainListener {
void itsRaining(){ System.out.println("Hey, take your coat!");
}
);
}
it would be just
public void announceRain ( void fn() ){ fn(); }
public void testRain(){
announceRain( { System.out.println("Hey, take your coat!"); } )
}
or similar.
I like the proposal published recently on JSR.
Basically, closures ought to be syntax shortcut for functors. So they should be backward compatible with interfaces – that means, each closure parameter type would create one „anonymous interface“, and each closure implementation should be a static final functor implementing that interface.
public String process( List<String> list, String fn(String item) ){
String res = "";
for( String str: list )
res += fn( str );
}
public void testClosure(){
List<String> list = Arrays.asList( new String[]{"foo","bar"} );
// item - auto-named, using the process params definition.
System.out.println( process( list, { item.reverse() } ) ); // like { return item.reverse(); }
}
public String process( List<T> list, String fn(T item) ){
String res = "";
for( T str: list )
res += fn( str );
return res;
}
public void testClosure(){
List<String> list = Arrays.asList( new String[]{"foo","bar"} );
// item - type computed from the type of `List` item and `fn`'s definition.
System.out.println( process( list, { item.reverse() } ) );
}
This would work like „anonymous interfaces“ – the compiler would check whether the method fits the type constraints. This would keep interfaces and functors backwards compatible.
public class ClosureExample {
public String process( List<T> list, String fn(T item) ){ ... }
String myClosure(String item){ return item.reverse(); }
public void testClosure(){
System.out.println( process( list, myClosure ) );
}
}
… would act like if there was an „anonymous interface“:
private interface AnonInterface01 { String fn(T item); }
public class ClosureExample {
public String process( List<T> list, AnonInterface01 fn ){ ... }
class AnonFunctor_1 implements AnonInterface01 {
String myClosure(String item){ return item.reverse(); }
}
final AnonFunctor_1 FUNCTOR_01;
public ClosureExample(){ FUNCTOR_01 = new AnonFunctor_1(); }
public void testClosure(){
System.out.println( process( list, FUNCTOR_01 ) );
}
}
For the case with myClosure in other class,
AnonFunctor_1 would be moved to that class, and thus
this would also point to that class.
The syntax of calling a closure in other class would simply use a dot (I dislike the hash notation):
public void testClosure(){
System.out.println( process( list, OtherClass.myClosure ) );
}
this in closures):private String concat = "";
public void testClosure(){
List<String> list = Arrays.asList( new String[]{"foo","bar"} );
// For anonymous closures, "this" resolved to current "this"
System.out.println( list.each( { this.concat += item.reverse(); } )
// For explicit closures, "this" resolves to their object.
System.out.println( list.each( myClosure ) );
}
These would be methods that reference only methods in itself. Intended to
abstract some common logic without need of abstract classes
or AOP.
interface Phone {
void callNumber( String number );
void callMe(){ this.callNumber("+420 777 555 555"); }
}
Combined with inheritance, this could be a very effective way to create mix-ins:
interface Sumarizer extends ListIterator<Integer> {
public int getSum(){
int ret = 0;
while( hasNext() )
ret += next();
}
}
/* Couldn't come up with better use case out of my head. */
* implement an ordered map.
* include org.apache.commons.lang.StringUtils.
* Simpler API for sound.
* java.util.Properties – rewrite, do not inherit from a map.
* java.util.regex: Support for recursion as in PCRE –
(?0).
More to come later.
See also: http://www.linkedin.com/groupAnswers?…