ページ

2014年3月13日

javaのenum

とあるところで書いたものの転載


昔のコード

  int sex = 0; // 1: male, 2: female, 0: other

数字の意味が思い出せない年寄りのために、昔のコードをちょっとだけリファクタリング

  public static final int SEX_MALE = 1;
  public static final int SEX_FEMALE = 2;
  public static final int SEX_OTHER = 0;

  int sex = SEX_OTHER;

でも、こんなコードが何処かで…

  this.sex = 3;

maleとfemaleを足しあわせたものはOTHERじゃなくって、3という発明をしちゃった開発者が…。そんな発明は素敵だけど、もう、させないぞ。

  public enum Sex {
      MALE(1),
      FEMALE(2),
      OTHER(0);

     private int v;
    
     private Sex(int v) {
         this.v = v;
     }
   
     public int getIntValue() {
        return v;
     }
  }

  Sex sex = Sex.OTHER;

※ public enum sex {OTHER, MALE, FEMALE}でもいいけど、特別な値もいれられるために、あえて上のように書いています。

これで、MALEとFEMALEを足しあわせたものは、勝手に作れなくなったよ。


でも、formがポストしてくるのはfemaleとかmaleとかの文字列です。どうやって、区別するんですか?

  if (value.equals("male")) {
     sex = Sex.MALE;
  } else if (value.equals("female")) {
    sex = Sex.FEMALE;
  } else {
    sex = Sex.OTHER;
  }

嘘です。こんなコード、書いていたら、アリエルのこわーい中山さんという人に袋たたきに会います。

  sex = Sex.valueOf(value.toUpperCase());


でも、フォームの場所によっては数字で来るんです。
じゃあ、Sexがもっといろいろできるようにしたちゃえ。

   public enum Sex {
     : 中略
     public Sex valueOf(int v) {
        for (Sex s: Sex.values()) {
            if (s.getIntValue() == v) {
                return s;
            }
         }
         return OTHER;
     }
   }

でも、変な値が来たら無条件にOTHERにするのはどうも・・・。ということで

     public Sex valueOf(int v) {
        for (Sex s: Sex.values()) {
            if (s.getIntValue() == v) {
                return s;
            }
         }
         throws IllegalArgumentException("sex : " + v);
     }

0 件のコメント: