北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Effective Java - 内部クラス

内部クラスって意外に強力ですね。

abstract class Hello {
    public abstract String hello();

    // 日本語のハロー関数ポインタ
    public static Hello getJapan(){
	return new Hello() {
	    public String hello() { return "こんちわ"; }
	};
    }

    // 英語のハロー関数ポインタ
    public static Hello getEnglish(){
	return new Hello() {
	    public String hello() { return "Hi"; }
	};
    }

    // 独自のハロー関数を作る(クロージャっぽい)
    public static Hello getOriginal(final String msg){
	return new Hello() {
	    public String hello() {return msg;}
	};
    }

}

/*
 利用法
 pw.println(Hello.getJapan().hello());	
 pw.println(Hello.getEnglish().hello());
 pw.println(Hello.getOriginal("んちゃ").hello());
*/

こうするとクロージャっぽいクラスを返せる、と。ただ、内部クラスからは、ローカル変数についてはfinalな変数しか参照できないようなので、あんまりに自由なことは出来ませんね。finalじゃないと、

test.java:22: local variable msg is accessed from within inner class; needs to be declared final

と怒られます。


蛇足的なおまけ。perlをやってて久々にjavaると忘れること。

  • ; をつけない
  • 戻り値を書かない