読者です 読者をやめる 読者になる 読者になる

リテラルは先か後か

お休みだ、と思って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を定義してでごにょごにょすれば上の表現でもいけるんだけど、
????
となる気がしなくもない。
普通が一番なんちゃうか、という気がしなくもない。