`

Java Enum类语法和用法解析

    博客分类:
  • java
 
阅读更多
一.语法
1. Enum的全称为enumeration,中文俗称枚举类,学过C/C++等语言的人,应该都对它略知一二.
但在Java语言规范中,是在JDK 5版本中才引入的,存放在 java.lang 包中。在Java版的Enum实质是语法糖,其声明方式如下:
package felix.fu
public enum Color{ 
    RED,
    BLUE,
    BLACK,
    YELLOW,
    GREEN 

enum是用来声明枚举的关键字,声明定义的类都隐含继承了一个父类(java.lang.Enum<E>),因此枚举不能再继承,但仍可实现接口。
该父类有两个私有属性name(枚举类型的名称)和ordinal(枚举实例被创建的序数),分别通过name()和ordinal()暴露出来了.
定义在枚举类型里的每一个枚举实例都将映射到Enum的子类中,其实例的名称和在枚举类型里定义的顺序都会传入到这个构造函数里
protected Enum(String name, int ordinal)。
  2. 如果想更清楚了解一下Enum,可以用反编译工具把自己定义的枚举反编译一下就一目了然了,它就是一个普通的类,
     只是Java语言规范从Code角度进行了限制,执行javap felix.fu.Color命令如下:
  public final class Color extends java.lang.Enum{
    public static final Color RED;
    public static final Color BLUE;
    public static final Color BLACK;
    public static final Color YELLOW;
    public static final Color GREEN;
    static {};
    public static Color[] values();
    public static Color valueOf(java.lang.String);
}
3. 如果定义的枚举有自己的构造函数必须声明私有的

二.用法
1.使用场景
(1) 常用于对同一类常量进行分类
(2) 声明接口方法时,输入参数类型采用枚举比用原始类型值常量更严谨.
(3) 常量有时往往不仅仅只是一个值,有可能会包含多个属性,此时很适合用枚举
(4) 有时常量对象需要从配置文件中读取其描述信息或者UI显示信息,此时也适合用枚举
(5) 从Java语法层面来说,枚举可以在switch使用,在if中可直接进行比较
(6) 声明枚举属性时最好用public final修饰,使用起来会非常方便
(7) 自定义枚举时,建议不要使用自带的name()和ordinal()方法返回值来与原始值类型转换,这样业务不依赖其枚举的名字和顺序,如下:
public enum Color {
    RED(0), BLUE(1), BLACK(2), YELLOW(3), GREEN(4);

    public final int value;

    /**
     * @param value
     */
    private Color(int value) {
        this.value = value;
    }

    public static Color getInstance(int value) {
        for (Color code : values()) {
            if (code.value == value)
                return code;
        }

        return null;
    }
}

2.实例:声明了一个基于枚举的简单异常框架,采用枚举来实现
public interface ExceptionCode {
/**
* 返回异常码
*/
    String getErrorCode();
   
/**
* 返回异常描述
* @param args 异常描述所用到的占位符值数组
*/    
    String getErrorCause(Object... args);
}

public enum DbExceptionCode implements ExceptionCode {
    UNIQUE_KEY("10001", "主键约束错误"),

    FOREIGN_KEY("10002", "外键约束错误");

    public final String errorCode;
    public final String errorName;

    private DbExceptionCode(String errorCode, String errorName) {
        this.errorCode = errorCode;
        this.errorName = errorName;
    }

    @Override
    public String getErrorCode() {
        return errorCode;
    }

    @Override
    public String getErrorCause(Object... args) {
        // TODO need to read from configuration by errorCode
        String errorCause = "";
        return MessageFormat.format(errorCause, args);
    }
}

public class DbException extends RuntimeException {

    protected String errorCode;

    protected String errorCause;

    /**
     * message format:BussinessErrorCode:BussinessErrorCause eg: 10010:无效Barcode[1000052]
     *
     * @param errorCode
     *            error code of bussiness
     * @param errorCause
     *            error cause of bussiness
     * @param cause
     */
    protected DbException(String errorCode, String errorCause, Throwable cause) {
        super(errorCode + ":" + errorCause, cause);
        this.errorCode = errorCode;
        this.errorCause = errorCause;
    }

    public DbException(ExceptionCode exceptionCode, Object... args) {
        this(exceptionCode.getErrorCode(), exceptionCode.getErrorCause(args));
    }

    public DbException(Throwable cause, ExceptionCode exceptionCode, Object... args) {
        this(exceptionCode.getErrorCode(), exceptionCode.getErrorCause(args), cause);
    }

    public DbException(ExceptionCode exceptionCode, Throwable cause) {
        this(exceptionCode.getErrorCode(), exceptionCode.getErrorCause(), cause);
    }

    protected DbException(String errorCode, String errorCause) {
        this(errorCode, errorCause, null);
    }

    /**
     * @return the errorCode
     */
    public String getErrorCode() {
        return errorCode;
    }

    /**
     * @return the errorCause
     */
    public String getErrorCause() {
        return errorCause;
    }

}

三. 弊端: 就是与原始值类似转换起来有点麻烦
分享到:
评论

相关推荐

    Java中的Enum的使用与分析

    ### Java中的Enum深入解析 #### 引言 在Java编程语言中,`Enum`是一种特殊的数据类型,用于处理一组固定的常量。它不仅提供了一种更安全、更灵活的方式来表示一组固定的选择,还包含了丰富的内置功能,使得枚举...

    Antlr4 JAVA 语法解析器

    解析java语法 grammar Java; // starting point for parsing a java file compilationUnit : packageDeclaration? importDeclaration* typeDeclaration* EOF ; packageDeclaration : annotation* 'package' ...

    Java语法大全史上最全语法

    根据提供的文件信息,本文将对Java语法进行详细的解析与总结,包括基本的语法结构、关键字、数据类型、变量声明及转换等内容。 ### Java语言概述 Java是一种广泛使用的面向对象编程语言,由Sun Microsystems开发并...

    JavaScjp 认证之拖拽题及解析

    在Java SCJP(Sun Certified Programmer for the Java 2 Platform)认证中,拖拽题是一种常见的题型,考察考生对Java语法和概念的理解。以下将针对提供的部分内容进行详细解释。 ### 题目1:数组元素输出 题目要求...

    javajavajava

    13. **Java标准库(Java API)**:包括大量的预定义类和方法,如集合框架、IO流、网络编程、日期和时间API等。 14. **JVM内存管理**:理解堆、栈、方法区、本地方法栈等JVM内存区域的工作原理,以及垃圾回收机制。 ...

    Java选择题武汉大学JAVA基础.pdf

    Java集合框架提供了存储和操作对象集合的一系列接口和类,如List、Set、Map等。 17. Java的I/O处理 Java的I/O处理涉及到读写数据流,包括java.io包中的File、FileReader、FileWriter等类。 18. Java的命令行参数 ...

    C#程序转Java程序代码转换器.zip

    4. 枚举(enum):C#中的枚举类型比Java的更强大,可以包含方法和常量。 5. 接口(interface):Java的接口可以继承多个接口,但不能包含实现,C#的接口可以包含默认实现。 6. 属性(property):C#中的属性提供访问...

    java表达式计算支持自定义运算

    这些运算符在编译时已经被解析和处理。然而,如果我们需要自定义运算符,例如引入一个新的复合操作或特殊逻辑,就需要利用Java的面向对象特性进行扩展。 1. **创建运算符枚举类**:在Java中,可以创建一个枚举类型...

    Java 6 认证最新学习指导

    14. **注解(Annotation)**:Java 6引入的新特性,用于提供元数据,可以在编译、部署和运行时被解析和处理。 15. **枚举(Enum)**:Java 6中的枚举类型提供了更好的方式来表示有限的固定集合,比传统的常量类更...

    jhipster jdl 语法图

    而`generated_serialized_grammar.js`可能是JDL的序列化语法解析器,它被用来解析和验证JDL文件,确保其符合定义的语法规范。 总的来说,JHipster JDL提供了一种高效的方式来管理JHipster应用程序的模型,通过`prog...

    疯狂java讲义02,03

    此外,集合框架是Java编程中的重要工具,03部分会详细阐述ArrayList、LinkedList、HashSet、HashMap等集合类的使用和实现原理。文件和I/O流的处理也是这部分的重点,包括文件操作、字节流、字符流以及对象序列化等。...

    Core java.

    - **`Object` 类的方法**:了解并正确使用这些方法对于编写有效的Java程序至关重要。 ##### 泛型ArrayList - **泛型**:Java SE 5引入了一个重要的新特性——泛型,它可以提供类型安全的集合。泛型允许在编译时检查...

    Java注解简单使用实例解析

    在Java中,注解可以出现在各种语法元素上,如类、方法、字段、参数等。今天,我们将通过实例代码来介绍Java注解的简单使用。 首先,让我们来了解一下Java注解的基本概念。Java注解是从Java 5开始引入的,用于提供元...

    Java 基础核心总结-副本

    Java集合框架是一组接口和类的集合,提供了一种高效管理对象的方式。ArrayList和LinkedList是两种常见的列表实现,分别适用于随机访问和频繁插入删除。Map接口代表键值对的集合,HashMap和TreeMap是其具体实现。Set...

    OCJP题库JAVA考试3

    选项A缺少变量声明,C中的`hashNext()`和`next()`方法不是标准的迭代方式,D使用for-each循环遍历数组,符合Java语法。 **知识点:** 可变参数的处理,以及Java中的循环结构。 **问题124** 选项C正确。在给定的...

    C#与JAVA的比较

    10. **成员访问操作符**:与C++中的箭头(`-&gt;`)和作用域解析操作符(`::`)不同,C#和JAVA统一使用点(`.`)操作符来访问对象的成员变量和方法。 11. `null` 和 `boolean` 关键字**:这两个语言都将 `null` 和 `...

    java附加题及参考答案

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而著名。这里提供的"java附加题及参考答案"压缩包包含了多个Java编程练习题目及其解答,旨在帮助学习者深入理解Java语言的核心概念和技术。...

    最新Java面试题及答案(Java基础、设计模式、Java虚拟机(jvm))

    ### 最新Java面试题及答案解析 #### 一、Java基础知识 **1.1 什么是Java** Java是一种广泛使用的高级编程语言,它是由Sun Microsystems在1995年发布的,并在之后被Oracle公司收购。Java的设计目标是创建一种能够...

    Java核心技术第八版随书源码

    6. **字符串处理**:String类在Java中非常常用,源码中会包含字符串的创建、比较、操作方法的使用等。 7. **包装类与基本类型**:源码可能会展示如何使用Integer、Double等包装类与原始类型相互转换。 8. **泛型**...

    Java基础学习13.pdf

    例如,`(参数列表) -&gt; {方法体}`,或者使用方法引用来表示,如`Comparator.comparing(String::length)`。 5. **类与类之间的关系**:在面向对象设计中,类与类之间存在多种关系,包括泛化(Generalization,即继承...

Global site tag (gtag.js) - Google Analytics