« 『Black Grast Laser Sceser Mouse』を買った! | トップページ | 『デバッグではじめるCプログラミング』を買ってみた♪ »

2011年10月26日 (水)

『java』の『enum』を配列で扱うには…

java の enum は、かなり特殊。

いや…

マシン後やC言語をやった後に、
java の enum は、かなり特殊に感じる。

本には「順番に依存するのは、よくない」とある。
それは、半面、正しいが、半面、正しくない。
「順番に依存することで効率良く処理できる」場合もある。
それは、プログラマーが考える事だと思う。

じゃあ、java の enum は、順番でアクセスできないかと思ったら
実は、抜け道があった。

以下のような enum を定義する。

    enum testList {
        e1("d1"),
        e2("d2"),
        e3("d3"),
        e4("d4"),
        e5("d5"),
        e6("d6"),
        e7("d7"),
        ;
        String string;
        testList(String string) {
            this.string = string;
        }
    }

これにアクセスるには、こんな感じのメソッドで対応するだろう。

    void testDisplay(testList obj) {
        System.out.println(obj.name() + " : " + obj.string);
        switch(obj) {
        case e1:
            System.out.println("hello");
            break;
        case e2:
            System.out.println("morning");
            break;
            //...
        }
    }

呼び出し側は、「testDisplay(testList.e1);」な感じになる。

で中身の総当たりの場合、以下のようにすると思う。

    void testOutA() {
        for(testList obj : testList.values()) {
            System.out.println(obj.name() + " : " + obj.string);
        }
    }

実は、この処理に求めるものがあった。
ひとひねりする事で配列になるのだ!

    void testOutB() {
        testList []obj = testList.values();
        for(int i = 0; i < obj.length; i++) {
            System.out.println(obj[i].name() + " : " + obj[i].string);
        }
    }

この処理の発見は、元々ガーベージコレクション対策。

『for-each』は、当然のごとく『new』でイテレータを生成する。
つまり「for(testList obj : testList.values()) {」は、
ガツガツとメモリを食い荒らし、GCを起こす原因となる。
GCを起こさないようにするには、使用をやめるしかない。
つまり代替え処理を見つけなくてはならない。

じゃあ、それ以外の方法は、無いかと言うところで発見した。

最初に配列化しておけば、使いまわせるので
CGが抑えられると言う訳。

    // 最初に定義し、以後使いまわす。
    final testList [] testListArray = testList.values();

    void testOutC() {
        for(int i = 0; i < testListArray.length; i++) {
            System.out.println(testListArray[i].name() + " : " + testListArray[i].string);
        }
    }

メモリー上に同じ情報が重複するが、
GCが起きるよりずっとましだと考えるなら
検討する価値があるのでは?

また、配列アクセスが行いたいのなら、
これで便利になると思う。

|

« 『Black Grast Laser Sceser Mouse』を買った! | トップページ | 『デバッグではじめるCプログラミング』を買ってみた♪ »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/53085035

この記事へのトラックバック一覧です: 『java』の『enum』を配列で扱うには…:

« 『Black Grast Laser Sceser Mouse』を買った! | トップページ | 『デバッグではじめるCプログラミング』を買ってみた♪ »