memorandums

日々の作業ログです。

Scala本を少し読み始める

Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)

Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)

溜まった仕事も一段落したので積んどく状態だった上記の本を少し読み始めました。1章に出てきたjavaのコードで思わず!?引っかかってしまいました。匿名クラスを使った例です。scalaが以下にシンプルに記述できるかjavaと比較しようという趣旨の箇所です。あれ、何となくわかるけどこれってどうやって書くんだろう?そういえば真面目に匿名クラスなんて書いたこと無かったな。。。


この話題が記載されているのは英語版の15〜16ページです。こちらGoogle Booksで抜粋が読めます。


Stringに大文字が含まれているか検査するプログラム。単純に書くと以下のようになるでしょうという記載があります。


■Program-1

boolean nameHasUpperCase = false;
for (int i=0; i<name.length(); ++i) {
    if (Character.isUpperCase(name.charAt(i))) {
        nameHasUpperCase = true;
        break;
    }
}

まず間違いなく私もこう書くでしょう。scalaであれば以下のように書けますとあります。


■Program-2

val nameHasUpperCase = name.exists(_.isUpperCase)

で、javaで(interfaceと匿名クラスで)一工夫すると以下のように書けますよ、という例が記載されています。


■Program-3

interface CharacterProperty {
    boolean hasProperty(char ch);
}
exists(name, new CharacterProperty() {
    public boolean hasProperty(char ch) {
        return Character.isUpperCase(ch);
    }
});


さて、Program-3はこれだけでは動作しません。完全動作するJavaアプリケーションをさらりと書けるでしょうか?私は書けませんでした。。。試行錯誤すること1時間弱。いやはや。。。足りないことは日々補えばいいんです>負け惜しみ精神ですね。


そんなもの書けるのは当たり前よ!!という方はここで終了です。お疲れさまでした。


いや。。。わかんないな。。。という方はぜひ書いてみてください。明日にでもここに答えを書きますね。匿名クラスは。。。1、2年次のプログラミングの授業では扱わなかったような気がします。。。教科書である「やさしいJava」の目次には無いですね。>意地悪な私。


匿名クラス以前の話ですが、生成したインスタンスの代入先がないコードを産まれて初めて見たときに、随分と違和感を感じた覚えがあります。例えば以下のような感じのコードです。皆様はいかがでしたでしょうか?

class A {
    public A()
    {
        System.out.println("The constructor A::A() called");
    }
}

class ATest {
    public static void main(String [] args) {
        new A();
    }
}