`
longgangbai
  • 浏览: 7249856 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

在项目中一些相关常量数组使用枚举应用

阅读更多

  在项目中采用Hibernate中支持枚举类型因此我们使用许多枚举类型。替代了简单的int数据数据类型的。在项目开发时应用常量就更加有意义了,不用使用简单的int了,你的类就可以使用像WeekDay.TUESDAY这样的常量了。但是这里隐藏着一些问题,这些常量是Java中int类型的常量,这意味着该方法可以接受任何int 类型的值,即使它和WeekDay中定义的所有日期都对应不上。因此,您需要检测上界和下界,在出现无效值的时候,可能还要抛出一个IllegalArgumentException。而且,如果后来又添加另外一个日期(例如WeekDay.SATURDAY ),那么必须改变所有代码中的上界,才能接受这个新值。 换句话说,在使用这类带有整型常量的类时,这个方案也许可行,但并不是非常有效。

 

Joshua Bloch老大这时站了出来,在他的著作《Effective Java》中提出了在这样场景下的一种非常好的模式——

Type-safe enumeration pattern。

这个模式简而言之就是给这样的常量类一个私有的构造方法,

然后声明一些public static final的同类型的变量暴露给使用者,例如:

 

如下枚举类:

 

public enum ForeignCardType {

//枚举的常量

 VISA("VISA", "VISA"), JCB("JCB", "JCB"), DINERSCLUB("DINERSCLUB", "Diners Club"),
    MASTERCARD("MASTERCARD", "Master Card"), AMERICANEXPRESS("AMERICANEXPRESS", "American Express");

 

 private String code;

 private String description;

 

//私有构造的应用 

private ForeignCardType(String code, String description) {
  this.code = code;
  this.description = description;
 }

 public String getCode() {
  return code;
 }

 public void setCode(String code) {
  this.code = code;
 }

 public String getDescription() {
  return description;
 }

 public void setDescription(String description) {
  this.description = description;
 }

//自己封装的枚举方法

 public static ForeignCardType fromCode(String code) {
  return EnumUtils.fromEnumProperty(ForeignCardType.class, "code", code);
 }
}

 

 

这样做也避免了可以随意向方法中传递一个不合法的int型数值(例如-1)而造成程序错误。同时,它还会带来其他的一些好处:由于这些枚举的对象都是一些类的实例,所以在里面放一些需要的属性来存放数据;又由于他们都是单例的,你可以使用equals方法或是==符号来比较它们。

 

一个EnumUtils类用户提供外部访问一个特定的枚举值时使用(如果你仔细学习Spring的源代码工具类时,你将发现在spring中存在许多类使用抽象类,但是类里的方法采用静态的方法,提供外部用类名访问,防止用户创建类实例)

 

public abstract class EnumUtils {

 /**
  * 从指定的枚举类中根据property搜寻匹配指定值的枚举实例
  * @param <T>
  * @param enumClass
  * @param property
  * @param propValue
  * @return
  */
 public static <T extends Enum<T>> T fromEnumProperty(Class<T> enumClass, String property, Object propValue) {
  T[] enumConstants = enumClass.getEnumConstants();
  for (T t : enumConstants) {
   Object constantPropValue;
   try {
    constantPropValue = BeanUtils.getDeclaredFieldValue(t, property);
    if (ObjectUtils.equals(constantPropValue, propValue)) {
     return t;
    }
   } catch (Exception e) {
    throw new RuntimeException(e);
   }
  }
  return null;

 }

 /**
  * 从指定的枚举类中根据名称匹配指定值
  * @param <T>
  * @param enumClass
  * @param constantName
  * @return
  */
    public static <T extends Enum<T>> T fromEnumConstantName(Class<T> enumClass, String constantName) {
        T[] enumConstants = enumClass.getEnumConstants();
        for (T t : enumConstants) {
            if (((Enum<?>) t).name().equals(constantName)) {
                return t;
            }
        }
        return null;
    }
 
}

分享到:
评论

相关推荐

    Delphi.7应用教程

    2.1.3 Delphi 7中的常量与变量 2.1.4 Delphi 7中的运算符与表达式 2.1.5 Delphi 7的语句书写规则与赋值语句 2.1.6 Delphi 7的常用函数与过程 2.2 典型实例 2.3 上机练习 课后考场 第3章 基本程序设计语句 3.1 理论...

    基于Symbian OS的手机开发与应用 part1

    第7~11章为基本图形界面开发部分,主要介绍如何在S60环境中创建基于控件、视图、面板、对话框、列表框的应用程序;第12~17章为提高部分,主要介绍异步事件处理、文件系统开发、多媒体编程、串口通信编程、TCP/IP...

    基于Symbian OS的手机开发与应用 part3

    第7~11章为基本图形界面开发部分,主要介绍如何在S60环境中创建基于控件、视图、面板、对话框、列表框的应用程序;第12~17章为提高部分,主要介绍异步事件处理、文件系统开发、多媒体编程、串口通信编程、TCP/IP...

    基于Symbian OS的手机开发与应用 part2

    第7~11章为基本图形界面开发部分,主要介绍如何在S60环境中创建基于控件、视图、面板、对话框、列表框的应用程序;第12~17章为提高部分,主要介绍异步事件处理、文件系统开发、多媒体编程、串口通信编程、TCP/IP...

    keykey:创建一个键&lt;->值镜像。 对于常量枚举很有用。 灵感来自Flux的Keymirror

    按键 萨满的KeyMirror替代品。 创建枚举 友好的功能编程(单独或作为数组传递密钥) 在热代码路径中表现良好 ... 而且,如果需要,可以访问此缓存,这可以使您的应用程序中的常量看起来很有趣。 在/test

    java程序设计实验代码

    首先在程序中定义一个枚举类型,它含有7个枚举常量,分别表示一个星期每一天的名称。然后在控制台窗口中输出这些名称。 注:要求分别用一般形式的For 语句和For语句的简化写法在控制台窗口中输出这些名称。 java编码...

    VISUAL BASIC 编程标准

    第二部分 编程中使用的约定 第3章 命名约定 23 3.1 数据类型后缀 23 3.2 匈牙利标记法 23 3.2.1 表示变量数据类型的前缀 24 3.2.2 表示变量的作用域的前缀 25 3.2.3 其他前缀 26 第4章 使用常量和枚举值 28 4.1 使用...

    零起点学通C++多媒体范例教学代码

    13.12在虚函数中使用成员名限定 13.13虚析构函数 13.14总结 第14章 数组 14.1 数组的基本用法 14.1.1 什么是数组 14.1.2数组元素 14.1.3数组下标越界 14.1.4 倒序输出 14.1.5 将数组的下标定义为常量 14.1.6 手动...

    零起点学通C++学习_多媒体范例教学代码

    13.12在虚函数中使用成员名限定 13.13虚析构函数 13.14总结 第14章 数组 14.1 数组的基本用法 14.1.1 什么是数组 14.1.2数组元素 14.1.3数组下标越界 14.1.4 倒序输出 14.1.5 将数组的下标定义为常量 ...

    Visual C# 2005程序设计自学手册 随书源码第一部分(共三部)

    14.3 GDI+在实际开发中的应用 327 14.3.1 利用柱形图分析每月的商品销售情况 327 14.3.2 利用折线图分析网站访问流量 330 14.3.3 利用饼形图分析公司男女比例 333 14.4 本章小结 334 第15章 Windows打印...

    delphi 开发经验技巧宝典源码

    0047 在过程中使用常量参数 31 0048 在过程中使用数组参数 31 0049 在过程中使用默认参数 31 2.4 其他 32 0050 如何在字符串中使用单引号 32 0051 结构对象的定义与使用 32 0052 使用数组为TlistView...

    delphi 开发经验技巧宝典源码06

    0047 在过程中使用常量参数 31 0048 在过程中使用数组参数 31 0049 在过程中使用默认参数 31 2.4 其他 32 0050 如何在字符串中使用单引号 32 0051 结构对象的定义与使用 32 0052 使用数组为TlistView...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    16.3 在windows应用程序中使用索引器 293 第16章快速参考 297 第17章 中断程序流程并处理事件 299 17.1 声明和使用委托 299 17.1.1 自动化工厂的例子 300 17.1.2 不使用委托来实现工厂 300 17.1.3 使用委托来...

    超级有影响力霸气的Java面试题大全文档

    SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。  对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器...

    C#基础与案例开发详解 源代码

    本书由浅入深、循序渐进地介绍了C# 的产生与发展、C# 的特点、C#程序设计的组成、常量与变量、数据类型、运算符与表达式、结构化程序设计、数组与集合、结构与枚举、可视化程序设计、C# 的文件操作和C# 的数据库操作...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    在程序中,一律禁止使用枚举类型。 多选 26.关于maven依赖、仲裁、规则,下列哪些说法是正确的:ACD A .的依赖会默认传递给子项目。 B .的依赖绝对不会传递给子项目。 C .在中指定版本号。 D .避免在不同的...

    C#基础与实例详解配书源码

    《C#基础与案例开发详解》由浅入深、循序渐进地介绍了C# 的产生与发展、C# 的特点、C#程序设计的组成、常量与变量、数据类型、运算符与表达式、结构化程序设计、数组与集合、结构与枚举、可视化程序设计、C# 的文件...

Global site tag (gtag.js) - Google Analytics