それはJavaのパワー

[id:r_ikeda:20090331:oneliner]に、

動的言語なのでこんなのも書ける。

groovy -e '[Long,Integer,Short,Byte].each() { println it.MAX_VALUE }'

と書いてあったのですが、これはJavaでも書けます。

for (Class c: new Class[]{Long.class, Integer.class, Short.class, Byte.class}) {
    System.out.println(c.getField("MAX_VALUE").get(null));
}

Groovy版の形を整えれば

[Long,Integer,Short,Byte].each {
    println(it.MAX_VALUE)
}

となり、ほぼ同一です。完全に等価にするとすれば、

for (Class c: Arrays.asList(Long.class, Integer.class, Short.class, Byte.class)) {
    System.out.println(c.getField("MAX_VALUE").get(null));
}

あたりでしょうか。これが出来ること自体はJavaのパワーです。
とはいえ…やっぱりGroovyって簡潔です。
Javaだと実行するためにはさらにClass定義とmainメソッド定義が必要で、さらにimportも要るので

import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
        for (Class c: Arrays.asList(Long.class, Integer.class, Short.class, Byte.class)) {
            System.out.println(c.getField("MAX_VALUE").get(null));
        }
    }
}

なんてことになります。throwsなんて手抜きをせずにちゃんとcatchし出すとさらに凄いことに…
この辺はGroovyのパワーですが、動的かどうかはあまり関係なくて、色々積み上げられたシンタックスシュガーが効いてるんですね。
まぁ、土台となってるJava(VM + API)もかなり貢献しているので、評価してやってほしいなー、と思ったのでした。