自定义枚举类型实体类

一、枚举实例说明

枚举关键字 enum,用更为简便的标识来替代特殊意义的字符或字符串。

举个栗子,每周七天,我们通过1-7来表示,这就是基本的枚举。

枚举值

Monday

Tuesday

Wednesday

Thursday

Friday

Saturday

Sunday

枚举类型

1

2

3

4

5

6

7

二、开发中的枚举数据

2.1 说明

在实际开发中我们会用到枚举类型,枚举数据档案存放在某个表中,实体V类型O对应的数据表中存放枚举,然后通过枚举类型获取枚举值,来显示真实的数据信息。

2.2 供应商付款单下的枚举数据

数据字典中供应商付款单部分枚举数据如下图所示

供应商付款单往来对象枚举类型的元数据信息如下图

数据字典枚举列表下有数据的即当前表对应的元数据有引用枚举类型,数据表存放的数据为枚举类型,若使用枚举值,则需要通过其他方法在获取枚举值。

供应商付款单 ap_paybill在数据库中存放往来对象字段的数据为枚举类型,即"0","1","2","3"。而我们在前端页面或集成数据交互开发时需要显示的是真实的枚举值,即"0","1","2","3"对应的"客户","供应商","部门","业务员"。如下图所示。前台页面显示为枚举值,后台逻辑处理时数据为枚举类型"0","1","2","3"。

2.3 获取枚举类型对应的枚举值

以付款单 ap_paybill 下的往来对象 objtype 为例

查询供应商付款单表中往来对象的数据,查询结果为枚举类型,而不是枚举值。在开发中一般通过付款单 PayBillVO 交互使用,而通过 PayBillVO 实体只能获取到枚举类型,而不是我们真正需要的枚举值。

PayBillVO payBillVO = aggVO.getHeadVO();  
Integer objtype = payBillVO.getObjtype();//获取往来对象的枚举类型 0,1,2,3  复制代码

    我们写出下面语句

语句一:查询付款单中存储的往来对象

select ap.objtype from ap_paybill ap复制代码

语句二、通过枚举实体的元数据 ID查询数据表 md_enumvalue 能查到枚举类型及枚举值。

select me.enumsequence, me.name
    from md_enumvalue me
   where me.id = '94b934f0-e5f5-47d6-a4a8-fbad9eda9864'复制代码

语句三、通过实体类 PayBillVO的往来对象枚举类型获取枚举值

我们首先通过当前实体 PayBillVO类取得枚举类型objtype 值,再通过 objtype 来获取对应的枚举值。

select me.name
    from md_enumvalue me
   where me.id = '94b934f0-e5f5-47d6-a4a8-fbad9eda9864'
     and me.enumsequence =
         (select ap.obitype
            from ap_paybill ap
           where ap.pk_paybill = '1001A1100000000S41NH')复制代码

2.4 说明

只要使用的 SQL,那就需要消耗资源,考虑效率查询延时等问题,即时SQL语句很简单。所以我们获取枚举值还可以通过自定义枚举类型实体类处理该问题。

三、自定义枚举类型实体类

3.1 原理

键值对存放枚举数据,提供根据 key 获取 value 的方法。

3.2 实现

通过编写自定义枚举实体类,实现通过枚举类型获取枚举值的方法即可。无需访问 SQL,通过当前供应商付款单PayBillVO 获取 objtype ,再通过调用自定义枚举实体类直接可获取枚举值。

此处仍以供应商付款单的往来对象为例

3.3 代码演示

自定义枚举实体作为实体类,我们在public下新建包 nc.vo.arap.pub.pay,然后新建类 PayBillObjTypeEnum.java

自定义枚举类 PayBillObjTypeEnum.java

package nc.vo.arap.pub.pay;    
import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.LinkedHashMap;  
import java.util.List;  
import java.util.Map;    
import nc.ui.pub.beans.constenum.DefaultConstEnum;  
import nc.ui.pub.beans.constenum.IConstEnum;  
import nc.ui.pub.beans.constenum.IConstEnumFactory;    
/**  
 * @author niaonao 
 * @since 2018-03-06 
 * @version    
 * 供应商付款单、供应商付款单行 
 * 往来对象自定义枚举实体 
 * 2=部门,3=业务员,1=供应商,0=客户, 
 */  
public class PayBillObjTypeEnum implements IConstEnumFactory { 
       public PayBillObjTypeEnum() {      } 
     //初始化枚举数据集合
      private static Integer type[] = {2,3,1,0};
      private static String value[] = {"部门","业务员","供应商","客户"};
      private static Map<Integer, IConstEnum> map = new LinkedHashMap<Integer, IConstEnum>();
      //静态代码块,将枚举数据封装到 Map 中
      static {
          for (int i = 0; i < type.length; i++) {
              map.put(Integer.valueOf(type[i]),
                       new DefaultConstEnum(Integer.valueOf(i),value[i]));
          }
      }
      
     @Override 
     public IConstEnum[] getAllConstEnums() {
          List<IConstEnum> list = new ArrayList<IConstEnum>();
          for(Iterator<Integer> iter = map.keySet().iterator(); iter.hasNext();)
              list.add(map.get(iter.next()));
          return list.toArray(new IConstEnum[0]);
      }
      
      @Override
      public IConstEnum getConstEnum(Object paramObject) {
          //通过键值对的映射关系,获取键值
          return map.get(paramObject);
      }
    }复制代码

其中引入的三个文件是源码,不需要自己编写实现

import nc.ui.pub.beans.constenum.DefaultConstEnum;
import nc.ui.pub.beans.constenum.IConstEnum;
import nc.ui.pub.beans.constenum.IConstEnumFactory;

接口 IConstEnum.java

package nc.ui.pub.beans.constenum; 
   public interface IConstEnum {
      String getName();
      Object getValue();
  }复制代码

接口 IConstEnumFactory.java

package nc.ui.pub.beans.constenum;
public interface IConstEnumFactory {
IConstEnum[] getAllConstEnums();IConstEnum getConstEnum(Object value);
}复制代码

类 DefaultConstEnum.java

package nc.ui.pub.beans.constenum;    
import java.io.Serializable;    
public class DefaultConstEnum implements IConstEnum, Serializable {
      /**
       *
       */
     private static final long serialVersionUID = 7634115571828705954L; 
     private Object value; 
     private String name; 
     public DefaultConstEnum(Object value, String name) { 
           this.value = value; 
           this.name = name; 
     }       
    /** 
     * getShowName 方法注解。 
     */
     public String getName() { 
         return name;
     } 
      /** 
       * getValue 方法注解。
       */
      public Object getValue() {
          return value;
      }  
      /** 
       * 此处插入方法说明。
       *
       * @return java.lang.String
       */
      public String toString() {
          return getName();
      } 
      @Override
      public boolean equals(Object obj) {
          if (obj instanceof IConstEnum) {
              if (value == null && obj == null)
                  return true;
              else if (value != null) {
                  return value.equals(((IConstEnum) obj).getValue());
              }
            }
          return false;
      }
     
      @Override
      public int hashCode() {
          if(value == null)
              return super.hashCode();
          else
              return value.hashCode();
      }
  }复制代码

新建测试类 TestEnumObjType.java

package test;    
import nc.ui.pub.beans.constenum.IConstEnum;  
import nc.vo.arap.pay.PayBillVO;  
import nc.vo.arap.pub.pay.PayBillObjTypeEnum;    
/**  
 * @author niaonao 
 * @since 2018-03-06 
 * @version 
 * 
 */
public class TestEnumObjType {
      public static void main(String[] args) {
          PayBillVO payBillVO = new PayBillVO();   
          PayBillObjTypeEnum objEnum = new PayBillObjTypeEnum();
   
          //做假数据测试通过枚举类型获取枚举值的方法
          payBillVO.setObjtype(2);
          String objTypeValue =
                   objEnum.getConstEnum(payBillVO.getObjtype()).toString();
          System.out.println(objTypeValue);
          
          //遍历自定义枚举类型实体全部数据
          for (IConstEnum constEnum : objEnum.getAllConstEnums()) {
              String name = constEnum.getName(); 
              Integer value = (Integer) constEnum.getValue();
              System.out.println("NAME: "+name+"; VALUE: "+value);
          }
      }
    }复制代码

执行结果如下:

部门  
NAME: 部门; VALUE: 0  
NAME: 业务员; VALUE: 1  
NAME: 供应商; VALUE: 2  
NAME: 客户; VALUE: 3  复制代码