zoukankan      html  css  js  c++  java
  • java枚举类型的优势在哪里?--一个实例

    
        最近在做一个项目,其中涉及到一组操作,命名为: 1. “add”; 2. "logicDel"  3. "physicDel"  4. "update" 按照大家耳熟能详的方式将这四种操作作为 final 的属性进行声明。
    
                     public final String ADD = "add"
    
                                   ...
    
    于是就产生了这样的代码: if (ADD.equals(commandStr)){...}  
    
                                                     else if (UPDATE.equals(commandStr){...}  
                                                                ...
    
    后来做review的时候,越看越不爽,于是恶向胆边生,必须做掉这个有味道的代码!可是怎么做呢,忽然记起java1.5已经加入了枚举(enmu),为什么不试试呢。
    
    enmu Command{
    
          ADD,
    
          LOGICDEL,
    
          PHYSICDEL,
    
          UPDATE
    }
    
    这就是一个最简单的枚举了。可是它的好处是什么呢? 最直接的好处是可以进行类型检测了,比如说一个接受接受该命令的方法,在之前的方式中声明只能是这样:
    
    public void test(String command){} 这样是有风险的,参数是String那么就是说只要是String类型的参数那么在编译时就不会报错,没法保证该参数一定是在{“add”, "logicDel", "physicDel", "update"}这个集合中。比如说别人提供了“modify”这个参数,编译也是能通过的,这就不好了。但是如果用枚举的话方法的声明就可以使这样: public void test(Command){} 这就限制了操作一定是那四种。就在编译时进行了类型的检测。
    
    OK,开头还是不错的,但是我立刻出现了问题,可以看看标红的代码,很明显我试图判断一个操作类型,但是这个操作类型是用String表示的(确实如此,没法改变,因为这个操作来自于数据库表中的记录),怎么办呢,我首先应该将这个String变成enmu才行啊,怎么弄呢,难不成要写成这样:
    
    if("add".equals(cmmandStr)){return Command.ADD)
    
    else if...
    
    我靠,这么丑陋我重构干嘛啊!想了想,java肯定提供了解决的办法,查阅不表,果然有办法:
    
        public enum Command{
           ADD("add"),
           LOGICDEL("logicDel"),
           PHYSICDEL("physicDel"),
           UPDATE("update");
           private String commandStr;
           Command(String commandStr){
               this.commandStr = commandStr;
           }
           private static final Map<String, Command> stringToCommand = new HashMap<String, Command>();
           static{
               for(Command item : values()){
                   stringToCommand.put(item.toString(), item);
               }
           }
    
           public static Command fromString(String commandStr){
               return stringToCommand.get(commandStr);
           }
    
           @Override
           public String toString(){
               return this.commandStr;
           }
    
        }
    
    这样的话,标红的代码就变成这样了:
    
    Command test = Command.fromStr(commandStr);
    
    switch(test)
    
    case ADD ... 
             break;
    
    case LOGICDEL ...
    
             break;
    
    ...
    
    哈,是不是好多了啊!
    
    后经继续了解,java枚举除了上面提到的特定于常量的值外(标红)还可以特定于常量编写方法,用处就更大了。
    
    怎么说呢,其实不用枚举用之前那种final定义的方法也没啥不行,但是借用一句忘了从哪看到的话: 有了她就更优雅了。
  • 相关阅读:
    Eclipse无法正常启动,弹出对话框内容为 A Java Runtime...
    redis入门常用的命令操作(总结 一)
    初级工程师的面试
    公司金融学理论--MM理论
    以太坊开发环境搭建
    如何以树形结构显示文件目录结构
    Neural Network Basics
    大前端公共知识梳理
    出SS表
    iOS weak关键字
  • 原文地址:https://www.cnblogs.com/mrcharles/p/11879951.html
Copyright © 2011-2022 走看看