HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

"intでenum"の危険な罠

ずっとずっとずーっと前から言われていることで、Java 5からはenumも導入されたわけですが、そんな問題のあるコードに出くわしてしまいました‥orz
コードのイメージはこんな感じ。

// とあるbeanクラス
public class Xxx {
    public static final int YYY_AAA = 1;
    public static final int YYY_BBB = 2;
    public static final int YYY_CCC = 3;
    // 1 か 2 か 3 が入ることが想定される。でもノーチェック
    public void setYyy(int yyy) {
        this.yyy = yyy;
    }
}

// 問題の処理の断片
int yyy = 0;
if (条件-a) {
    yyy = Xxx.YYY_AAA;
} else if (条件-b) {
    yyy = Xxx.YYY_BBB;
} else if (条件-c) {
    yyy = Xxx.YYY_AAA;
}
// (問題1) どの条件にもマッチしなかった場合、yyy の値が0(zero)。
//   Xxx.setYyy()に渡す値としては不適切(ということになっている)
Xxx xxx = new Xxx();
xxx.setYyy(yyy);
// (問題2) 不適切であるはずの yyy の値を持った xxx の保存に成功してしまう。
ZzzAPI.saveXxx(xxx);

そんなわけで(謎)

  • 初期値選び/設定は慎重に。「ゼロってなによ!!」
  • あるいは、ちゃんとelseを書きましょう。「elseがないならないなりの理由があるはず!それこそコメントをっ!」
  • (今なら)enumを使いましょう。(上のコードはJ2SE 1.4時代のものなので‥)
  • お互いに、いい意味で相手を信用しない。「ZzzAPIでチェックしてはじいてくれるだろう」はあくまで理想であって、他人が使用する可能性のあるソフトのコードは二重三重にチェックして損することはない(と思う)

そんなことに振り回された一日(謎)