"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でチェックしてはじいてくれるだろう」はあくまで理想であって、他人が使用する可能性のあるソフトのコードは二重三重にチェックして損することはない(と思う)
そんなことに振り回された一日(謎)