我们经常要突破枚举编号的限制,自行制定枚举值的编号。对于这种需求,经常会写出下面的代码:

    1. enum WindSpeed implements SerialNoEnum {
    2. LOW(151),
    3. MID(153),
    4. HIGH(155),
    5. STRONG(107),
    6. SUPER_STRONG(156),
    7. AUTO(101);
    8. private final int serialNo;
    9. WindSpeed(int serialNo) {
    10. this.serialNo = serialNo;
    11. }
    12. public int getSerialNo() {
    13. return serialNo;
    14. }
    15. public static WindSpeed valueOf(int serialNo) {
    16. for (WindSpeed item : WindSpeed.values()) {
    17. if (item.serialNo == serialNo) {
    18. return item;
    19. }
    20. }
    21. return null;
    22. }
    23. public static boolean contain(int serialNo) {
    24. for (WindSpeed item : WindSpeed.values()) {
    25. if (item.serialNo == serialNo) {
    26. return true;
    27. }
    28. }
    29. return false;
    30. }
    31. }

    这种代码实现其实完全没有问题,但是一旦项目中需要使用大量类似的枚举类型,那么valueOf和contain的方法就会被写上无数次,而且慢慢还会出现各种各样的变种实现。对此,规范代码结构是非常必要的。
    初步想到的方式是实现一个接口,提供默认方法,让枚举类型实现接口:

    1. public interface SerialNoEnum {
    2. int getSerialNo();
    3. static <T extends Enum<T> & SerialNoEnum> T valueOf(Class<T> clazz, int serialNo) {
    4. for (T item : clazz.getEnumConstants()) {
    5. if (item.getSerialNo() == serialNo) {
    6. return item;
    7. }
    8. }
    9. return null;
    10. }
    11. static <T extends Enum<T> & SerialNoEnum> boolean contain(Class<T> clazz, int serialNo) {
    12. for (T item : clazz.getEnumConstants()) {
    13. if (item.getSerialNo() == serialNo) {
    14. return true;
    15. }
    16. }
    17. return false;
    18. }
    19. }

    修改后的枚举代码:

    1. enum WindSpeed implements SerialNoEnum {
    2. LOW(151),
    3. MID(153),
    4. HIGH(155),
    5. STRONG(107),
    6. SUPER_STRONG(156),
    7. AUTO(101);
    8. private final int serialNo;
    9. WindSpeed(int serialNo) {
    10. this.serialNo = serialNo;
    11. }
    12. @Override
    13. public int getSerialNo() {
    14. return serialNo;
    15. }
    16. }