Hallo,
neulich bin ich über das in Ruby geschriebene Web-Framework Sinatra gestolpert. Die Art, wie man in einem Sinatra-Controller eine Action definiert, finde ich beeindruckend kompakt und lesbar:
Sinatra: The Book
Soweit meine dürftigen Ruby-Kenntnisse reichen, dürfte "get" eine Funktion sein, der ein String ("/hi") und anschließend ein Funktionsobjekt (do ... end) übergeben wird.
Nun frage ich mich, wie man in Java etwas ähnlich kompaktes hinbekommen könnte. Da es in Java keine Funktionsobjekte gibt, könnte man sich mit eine inneren, anonymen Klasse behelfen:
Wobei "get" eine Methode der Controller-Klasse wäre, von der konkrete Controller abgeleitet sind. Allerdings ist das verglichen mit dem Ruby-Gegenstück nicht gerade elegant.
Man könnte sich noch mit Reflection behelfen und die Klasse zur Laufzeit analysieren:
Sieht schon besser aus, aber irgendwie mag ich Reflection nicht besonders, denn erstens wird damit unter Umständen das Typsystem aufgeweicht, Code wird schwer nachvollziehbar, da Annotationen "magisch" vom Framework ausgewertet werden und nicht zuletzt ist ein Methodenaufruf per Reflection lauf dem Buch "Effective Java" ca. 2 bis 50 mal langsamer als ein normaler Aufruf.
Fällt euch noch eine gute Möglichkeit ein?
neulich bin ich über das in Ruby geschriebene Web-Framework Sinatra gestolpert. Die Art, wie man in einem Sinatra-Controller eine Action definiert, finde ich beeindruckend kompakt und lesbar:
Code:
get '/hi' do
...
end
Soweit meine dürftigen Ruby-Kenntnisse reichen, dürfte "get" eine Funktion sein, der ein String ("/hi") und anschließend ein Funktionsobjekt (do ... end) übergeben wird.
Nun frage ich mich, wie man in Java etwas ähnlich kompaktes hinbekommen könnte. Da es in Java keine Funktionsobjekte gibt, könnte man sich mit eine inneren, anonymen Klasse behelfen:
Java:
public interface Action{
void perform();
}
get("/hi", new Action{
void perform(){
...
}
}
Man könnte sich noch mit Reflection behelfen und die Klasse zur Laufzeit analysieren:
Java:
@Web(path="/hi", verb="GET")
public void irgendeinname(){
...
}
Fällt euch noch eine gute Möglichkeit ein?
Zuletzt bearbeitet: