在项目中采用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;
}
}
分享到:
相关推荐
在实际编程中,数组、枚举和注解经常结合使用,例如在枚举中定义注解,用于处理特定逻辑或数据验证。 例如,一个简单的例子是使用枚举和注解来定义和验证颜色: ```java @Retention(RetentionPolicy.RUNTIME) @...
枚举(Enum)在Java中是一种特殊的类,用于创建一组相关的常量。枚举类型可以有方法和字段,也可以实现接口。枚举的定义格式如下: ```java public enum Color { RED, GREEN, BLUE } ``` 枚举实例可以直接使用其...
本文主要探讨Java初级教程中的第二章——基本数据类型、数组和枚举。 首先,Java语言中的注释是程序员为了提高代码可读性而添加的解释性文字。注释有三种形式:单行注释(//)、多行注释(/*...*/)和文档注释(/**...
在JDK 5.0之前,我们通常使用final关键字来创建不可变的变量,但这样的变量并非真正的常量。JDK 5.0引入了注解(Annotation),允许开发者在源代码中添加元数据,这其中包括了`@Deprecated`和`@Override`等预定义...
本代码笔记主要探讨了C#中的枚举类型及其在实际编程中的应用,特别强调了枚举结构数组的使用。下面将详细阐述枚举的定义、特点以及如何创建和操作枚举结构数组。 首先,枚举是C#中预定义的数据类型,允许我们定义一...
在编程语言中,C# 是一种面向对象的、现代的编程语言,被广泛应用于开发Windows应用程序、Web应用以及游戏开发。对于任何级别的C#开发者,理解变量、枚举(enum)和数组是至关重要的基础概念。下面将详细介绍这三个...
一些枚举支持序列化,可以将其转换为字符串或其他格式,便于在网络传输或存储中使用。 8. 枚举的扩展: 在某些语言中,如C#,枚举可以继承自其他枚举,形成层级关系,这在表示复杂系统中的分类时很有用。 9. ...
在电子工程和信号处理领域,数字波形是用于表示时间变化的数字数据序列,它们通常在计算机程序中以数组或枚举的形式存储。枚举(Enumeration)是编程语言中一种特殊的数据类型,它用于定义一组预定义的常量,每个...
4. **泛型**:泛型是Java SE 5.0引入的新特性,允许在类、接口和方法中使用类型参数,以增强类型安全性和代码重用。实验要求编写一个泛型类,实现不同形状(如正方形、圆形)的面积计算。泛型类可以定义为`class ...
本文将详细介绍如何在C语言中使用枚举类型(`enum`)来解决一个具体问题:计算并列出从五种颜色(红、黄、蓝、白、黑)的球中取出三种不同颜色球的所有可能组合。 #### 枚举类型基础 在C语言中,枚举(`enum`)是...
使用“动态数组构造函数”可以创建一个可变大小的数组,然后在程序运行过程中使用“动态数组追加”、“动态数组删除”等函数调整数组大小。 五、数组的运算 1. 数组的算术运算:可以对数组执行基本的数学运算,如...
在面试中,对枚举的理解和应用是衡量开发者专业技能的重要标准之一。本篇文章将深入探讨Java枚举的使用及其背后的原理。 一、枚举的定义与使用 1. 基本用法: 在Java中,枚举可以通过`enum`关键字来创建。例如,...
Java中的枚举是一种特殊的类,它提供了一种安全的...枚举的使用应当遵循良好的编程实践,如避免在枚举中包含过多的业务逻辑,保持枚举常量的简洁性,以及利用枚举提供的各种方法和特性来提升代码的可读性和可维护性。
在Java中,枚举类型不是简单的常量数组,而是一种完整的类,具有类的所有特性,如方法、构造函数和继承。下面将详细探讨`Enum`的基本概念、用法以及一些高级特性。 首先,枚举类型`Enum`的定义方式如下: ```java ...
这个“常量支持库.zip”压缩包包含了一个易语言项目的源代码,旨在帮助用户理解并学习如何在易语言中使用常量。 常量在编程中扮演着重要的角色,它们是固定不变的值,在程序运行过程中不能被修改。在易语言中,定义...
1. `values()`:返回枚举类型的全部常量数组,常用于遍历枚举。 2. `valueOf(String)`:根据字符串查找对应的枚举常量,若不存在则抛出`IllegalArgumentException`。 四、枚举与switch语句 枚举类型与Java的`switch...
本文将详细介绍如何在Java中使用枚举类型,并通过一个具体的例子来展示其优势。 #### 二、枚举类型概述 **枚举类型**是一种特殊的类,用于定义一组有限的固定常量。枚举类型可以提供更好的类型安全性和编译时检查...
枚举量可以用于定义常量,避免在代码中使用魔术数字,提高代码的可读性。 6. **枚举与数据类型** 虽然MATLAB的枚举是基于现有数据类型实现的,但它提供了更好的类型安全性和语义清晰度。理解枚举的概念对于编写...
在C语言中,数组的元素可以是整型、字符型、实型等各种基本类型,也可以是结构体类型、枚举类型等复杂类型。数组的元素可以通过下标来访问,例如,a[0]、a[1]、a[2]等。数组的下标从0开始,直到数组的长度-1。 ...