文章标签 » 工作笔记

Java | 对enum的扩展

遇到有一堆枚举值时,很容易就能想到 enum
比如性别(Gender),有男(Male)有女(Female),很容易就会写出下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public enum Gender {
  MALE("男"),
  FEMALE("女");
  
  private final String display;
  
  Gender(String display) {
    this.display = display;
  }
  
  public String getDisplay() {
    return display;
  }
}

可以这样使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Student {
  String name;
  String gender;
  
  // 男女有别
  public void doSomething() {
    Gender g = Gender.valueOf(gender);
    if (Gender.FEMALE == g) {
      // 女生啦啦队
    } else if (Gender.MALE == g) {
      // 男生打篮球
    }
  }
}

以上代码要想正常执行,有个前提条件,属性 gender 的值必须是 FEMALE 或者 MALE。如果数据库中存储的是 FM 呢?甚至是 12
这时,valueOf 方法已经不适用了。因为其参数值必须跟定义的枚举值完全一致。
针对这种情况,我想到了一个扩展。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 接口名想了好久,不知道用什么合适
public interface CodeEnum {
  boolean isIt(String code); // 方法名也拿不定主意
}

public enum Gender implements CodeEnum {
  // 用F-M还是1-2,这里可以随时调整
  MALE("M", "男"),
  FEMALE("F", "女");
  
  private final String display;
  
  Gender(String display) {
    this.display = display;
  }
  
  public boolean isIt(String code) {
    return this.code.equals(code);
  }
  
  public String getDisplay() {
    return display;
  }
}

这时,Student 类可以调整为:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Student {
  String name;
  String gender;
  
  // 男女有别
  public void doSomething() {
    if (Gender.FEMALE.isIt(gender)) {
      // 女生啦啦队
    } else if (Gender.MALE.isIt(gender)) {
      // 男生打篮球
    }
  }
}

抛砖引玉,有更好的想法欢迎留言讨论。