リテラルは先か後か
お休みだ、と思ってWeb閲覧をさっぱりしていませんでした。
すみません。
で、うだうだしているうちに"hoge".equalsに色々と反応をいただきました。
ありがとうございます。
nattowさんの
C 言語のバッドノウハウであるところの「"=" と "==" を間違えたとき分かるように前後逆にする」を引きずっているからじゃないかと。
バッドノウハウまたは宗教論争 - ごはんB定食
ああ、確かに
if (10 ==x) { ... } if (x == 10) { ... }
前者は相当きもいと思います。
odzさんの
if x equals 10 then ...
と
if 10 equals x then ...
定数との比較 - odz buffer
的な。
nullチェックや空文字列チェックは、StringUtilsなどを使えば良いので置いておくとして、
ぶっちゃけ「Enumを使え」ってのが正解なので議論する意味があんまりなかったり...
ぶっちゃけEnumを使えと。
if (Hoge.equals(stringValue)) { ... } if (stringValue.equals(Hoge)) { ... }
と、確かに違和感が緩和。(マジックナンバーでないからか)
が、"hoge"もobjectには違いはないので気分的なものと言えば気分的なもの。
しかし、純粋なEnumではこうはいかないんですよね……orz。(教えて偉い人!)
public enum HogeState { Hoge, Foo, Bar, } String stringValue = "hoge"; ... if ("hoge".equals(stringValue) { ... } if (HogeState.Hoge.equals(stringValue)) { // NG } if (HogeState.Hoge.toString().equalsIgnoreCase(stringValue)) { // OK...? }
これはちょっとださい。
(まぁ、enumの慣習にしたがってHogeと大文字を先頭にしており、その文字列表現と大小無視比較をする、なんてことをしているからだけど)
もちろん、enum HogeStateに対してコンストラクタとequalsを定義してでごにょごにょすれば上の表現でもいけるんだけど、
????
となる気がしなくもない。
普通が一番なんちゃうか、という気がしなくもない。