『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が起きるよりずっとましだと考えるなら
検討する価値があるのでは?
また、配列アクセスが行いたいのなら、
これで便利になると思う。
| 固定リンク
コメント