Java

2010/02/28

Javaのenum

アプリをやっているので、Javaのコードも書かねばならん。
どうも、慣れない・・・。

今回使いたかったのは、enum。


まず、Javaにenumはあるのか?から。
ある。
大昔にやったときは、ひたすらfinal使って書いていたような記憶があるが、まあ時代は変わるということか。

では使おう。

このソースでしか使わないから、privateでいいや。

private enum ETest {
ENONE,
EFIRST,
};

エラー。
どうやら、privateのenumはいかんらしい。
なんでだ?

eclipseがいうには、publicでなくてはならないらしい。
protectedもだめだった。
が、なにもなしは通った。
package公開(だっけ?)はpublic扱いということか。

定義の仕方は、C++と同じ。
typedefとかしなくても使えるので、Cと同じ、とは書かない。

では、使ってみよう。

ETest val = ETest.NONE;

これは、よし。
classと同じような扱いになるので、クラス名から書かねばならん。
これはC++と違うな。
C++はCの流れを引き継いでいるから、enumはenumだ。
もし同じようにしたければ、classかnamespaceにenum定義をすることになろう。
ただその場合も、enum名ではなくclass名で解決することになる。

では、switchさせてみよう。

switch(val) {
case ETest.NONE:
break;
case ETest.FIRST:
break;
}

エラー。
どうやら、ここのcaseでは、ETest.がいらないらしい。
何でだ??
valはETest型だから、省略できる、ならば理解はできる。
書くとエラーとは何事だ!

他と書き方を共通にしたいから、許してくれないかなぁ。

2010/02/19

Javaには詳しくない私の疑問

1つ前の記事で、XMLファイルのonClick属性にメソッド名を書いておくと、ボタンを押したときに呼ばれる、ということを書いた。

さて、あれはどうやって実現されているのだろう?
Javaはコンパイルするとclassファイルになり、そこにバイトコードが書かれているイメージだ。
ただ、ここはAndroid。正確にはJavaではない。
最後にできるのも、dexだし。

だけど、私はJavaに詳しくない。
あなたに話すネタもない。。。

だが、確かJavaは関数名やファイル名をそのままclassファイルに格納していたと思う。
そのしくみがあるから、JUnitなんかも使い勝手よくできるとかなんとか。
携帯向けのJavaアプリでは、関数名などを短くすることでサイズを削減させるとか。
XMLファイルをうまくコンパイルしてやれば、同じことができそうな気がする。
つまり、onClick属性をclassファイルに落とし込む、というような。

しかし・・・私にとって、文字列で関数を扱うというのは気が重たい。
別に私が取り扱うわけではないのだが、「文字列を」「全文一致で検索して」「関数を呼ぶ」というステップになるのが重たいのだ。
だって、普通にアドレス呼び出しであれば、一発やん。
もし仮想関数だったとしても、2ステップ。
しかし文字列比較となると、文字数分を1文字1文字比較しなくてはならん。
頻繁に呼び出すような関数であれば、確実にボトルネックだよなぁ。

まあ、ここはボタン操作みたいなUIだからいいや、という判断なのかも。
それに、コンパイル時にハッシュ値とかに変換してるかもしれんし。
いや、変換してくれているに違いない。

そんなどうでもいいことを考える金曜日の夜であった。

2009/09/24

ゼロサプレス

ゼロサプレス、というのはよく使うけど、ゼロサプレスなし、という表現はあまり見ない。
いつも間違えてしまうのだが、ゼロをサプレス、つまりゼロを抑制するのがゼロサプレス。
不要なゼロを取り除くと思えばいいのかな。
文字で「001」などと書いたものを数値に直すとき、「00」は不要だ。
だから、取り除こう。
という使い方かしら。

ゼロサプレスの逆は、ゼロサプレスなし、というよりも「ゼロパディング」がよさそうだ。
数字の表示桁数を統一したいので、桁のない部分にゼロを埋める。
私は「ゼロ埋め」と言っていたのだが、ゼロパディングの方が専門用語っぽくてよいな。
まあ、忘れるだろうけど。

普通に、数値を文字列化すると、ゼロサプレスになると思う。
Cで書くなら、

printf("%d", i);

のような。
ゼロサプレスするときは、

printf("%03d", i);

とかで書ける。
これがC++になると、ちとめんどう・・・

いかんいかん、ここはAndroidの話を。
つまり、Javaで。

java.text.DecimalFormatを使うようだ。

DecimalFormat df = new DecimalFormat("000");
System.out.println(df.format(i));

こんなのでよさそうだ。