关闭

java枚举分析

1500人阅读 评论(0) 收藏 举报
分类:

java枚举简单分析

    enum全称为enumeration,是JDK1.5中引入的新特性,位于包java.lang中。

    在JDK1.5以前,我们通常使用接口来定义常量:

public interface IConstants {
    String ONE= "one";
    String TWO= "two";
    String THREE= "three";
}

    创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

    基本原理:

    首先编写一个简单的枚举示例: 

package com.anxpp.demo;
public enum EasySingleton{
    ONE,TWO,THREE;
}

    这段代码实际上调用了3次 Enum(String name, int ordinal):

new Enum<EnumTest>("ONE",0);
new Enum<EnumTest>("TWO",1);
new Enum<EnumTest>("THREE",2);

    接下来,我们在控制台用javac命令编译EasySingleton.java:

javac C:\Users\u\Desktop\anxpp\Maven\Spring4Hibernate5MVC\src\test\java\com\anxpp\demo\SingleEnum.java

    得到class文件,在使用javap命令反编译(加上参数-c可以得到更详细的反编译结果):

C:\Users\u>javap C:\Users\u\Desktop\anxpp\Maven\Spring4Hibernate5MVC\src\test\java\com\anxpp\demo\SingleEnum.class
Compiled from "SingleEnum.java"
public final class com.anxpp.demo.SingleEnum extends java.lang.Enum<com.anxpp.demo.SingleEnum> {
  public static final com.anxpp.demo.SingleEnum ONE;
  public static final com.anxpp.demo.SingleEnum TWO;
  public static final com.anxpp.demo.SingleEnum THREE;
  public static com.anxpp.demo.SingleEnum[] values();
  public static com.anxpp.demo.SingleEnum valueOf(java.lang.String);
  public static void main(java.lang.String[]);
  static {};
}

    可以看到,枚举实际也是一个class,并且是继承了java.lang.Enum的,枚举常量都申明为public static final类型,只不过使用enum关键字后,看上去有点不一样,所以我们使用enum时时不能使用extends关键字的,因为java是单继承的。

 

    常用操作

public enum SingleEnum{
    ONE,TWO,THREE;
    public static void main(String args[]){
        System.out.println("for循环遍历:");
        for(SingleEnum singleEnum : SingleEnum.values()){
            System.out.println(singleEnum);
        }
        System.out.println("switch的使用:");
        SingleEnum singleEnum = SingleEnum.TWO;
        switch(singleEnum){
        case ONE:System.out.println("这是1");break;
        case TWO:System.out.println("这是2");break;
        case THREE:System.out.println("这是3");break;
        default:System.out.println(singleEnum);break;
        }
    }
}

    输出:

for循环遍历:
ONE
TWO
THREE
switch的使用:
这是2

 

    enum对象的常用方法:

    int compareTo(E o) 比较此枚举与指定对象的顺序。

    Class<E> getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象。

    String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。

    int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

    String toString() 返回枚举常量的名称,它包含在声明中。

    static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。

System.out.println(SingleEnum.ONE.compareTo(SingleEnum.TWO));
//这里会输出-1,因为ONE在前面

 

    可以给enum自定义属性和方法:

public enum SingleEnum{
    ONE(1),THREE(3){
        @Override
        public boolean isEven() {
            return false;
        }
    },TWO(2){
        @Override
        public boolean isEven() {
            return true;
        }
    };
    private int value;
    private SingleEnum(){}
    private SingleEnum(int value){
        this.value = value;
    }
    public int getValue(){
        return value;
    }
    public boolean isEven(){
        return false;
    }
    public static void main(String args[]){
        for(SingleEnum singleEnum : SingleEnum.values()){
            System.out.println(singleEnum + ":" + singleEnum.isEven() + singleEnum.getValue());
        }
    }
}
/*输出:
ONE:false1
THREE:false3
TWO:true2
*/


    单例模式最佳实现方式:

/**
 * 枚举实现单利模式
 * @author u
 *
 */
public enum EasySingleton{
    INSTANCE;
    /*
     * 其他代码
     */
    //获取实例方式
    //EasySingleton.INSTANCE
}

 

    结论:

    enum就是一个普通类,经过了编译器的优化,可以很好的实现单例模式。

 

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

[疯狂Java]集合:EnumSet、各Set性能分析(选择)

1. EnumSet——专门存放枚举类型元素的Set:     1) EnumSet只能存放一种枚举类型的元素,具体存放什么枚举类型的元素可以通过两种方法指定,一种是显式,一种是隐式;     2) ...
  • Lirx_Tech
  • Lirx_Tech
  • 2016-05-27 15:41
  • 1333

关于Java中枚举Enum的深入剖析

在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定。Java也不例外。Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析。 什么是Enum Enum是自Ja...
  • xjbclz
  • xjbclz
  • 2016-12-11 22:38
  • 2494

浅谈在Java开发中的枚举的作用和用法

枚举,是指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值。 在枚举出现之前,如果想要表示一组特定的离散值,往往使用一些常量。例如: package co...
  • u014527058
  • u014527058
  • 2016-10-07 20:02
  • 20971

java 枚举——java中枚举的运用和使用场景

转自:http://blog.csdn.net/yehui928186846/article/details/51426415 基本特性: 1,enum关键字  枚举enum是同class,int...
  • pangesange
  • pangesange
  • 2017-01-16 13:40
  • 2114

关于java枚举使用和理解。

前言在介绍枚举之前,先说说另外一个名词:[魔法数字]。 魔法数字,是指在代码中直接出现的数值。 如:user.setStatus(1);其中的数值1即为[魔法数字],你很难直观的理解这个1代表的含...
  • u014387604
  • u014387604
  • 2015-10-22 16:53
  • 588

JAVA 枚举使用详解

问题引入:如何限制用户输入class Student{ private String name; // 考试等级 private String grade; //等级只能是AB...
  • guanhang89
  • guanhang89
  • 2016-08-20 18:41
  • 1966

Java学习整理系列之Java枚举类型的使用

定义枚举类型其实就是在定义一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class或interface. 当使用enum定义枚举类型时,实际上所定义出来的类型是...
  • Sup_Heaven
  • Sup_Heaven
  • 2014-06-27 19:47
  • 43461

Java 枚举:实现接口

http://blog.csdn.net/veryitman/article/details/7945949 所有的枚举类都继承自 Enum,因为 Java 不支持多继承,所以枚举无法继承其...
  • caolaosanahnu
  • caolaosanahnu
  • 2014-06-23 14:16
  • 1312

【从头开始学Java】Java的继承(枚举、反射)

五、参数数量可变的方法 在Java中使用省略号...的形式来创建参数数量可变的方法。 public static double max( double... values); 调用方式:1> max...
  • u014482758
  • u014482758
  • 2015-12-28 13:15
  • 1007

Java 中对于枚举双值的使用

转成键值对或者是map 的形式; 键值对的类 public class Kav { /** * 键 */ private String key; /** * 值 */ pr...
  • wanghang88
  • wanghang88
  • 2016-07-22 09:15
  • 4219
    个人资料
    • 访问:749639次
    • 积分:5468
    • 等级:
    • 排名:第5698名
    • 原创:96篇
    • 转载:1篇
    • 译文:0篇
    • 评论:292条
    博客专栏
    其他信息