java枚举分析

1545人阅读 评论(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就是一个普通类,经过了编译器的优化,可以很好的实现单例模式。

 

查看评论

细说Java单利模式

        有时候我们创建一个对象是属于"工具型"对象,也就是只使用该对象的方法不改变改对象的一些属性值(个人理解),这类对象在每次使用的时候就没有必要每次都创建一个对象(避免...
  • u010972055
  • u010972055
  • 2018年03月14日 15:26
  • 33

Java面向对象-枚举的定义和特点以及底层分析

枚举是从Java5开始提供的一种新的数据类型,是一个特殊的类,就是固定的多个常量对象定义格式:[修饰符] enum 枚举类名 { 常量A,常量B,常量C; }我们自定义的枚举类型,在编译后(...
  • github_26672553
  • github_26672553
  • 2016年11月17日 13:40
  • 1026

枚举根节点

枚举根节点 该操作执行时间的敏感有三个原因 1.可作为GCRoots的节点主要在全局性的引用(如常量和类静态属性)与执行上下文(例如栈帧中的本地变量表)中,如果应用的方法区就有几百兆,那么如果逐个...
  • u012619033
  • u012619033
  • 2014年05月09日 08:49
  • 1268

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

枚举(enum),是指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值。枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色、方式、类别、状态等等数目...
  • u014527058
  • u014527058
  • 2016年10月07日 20:02
  • 30051

学习笔记:Java 分类枚举和策略枚举(枚举的嵌套)

我们总有把东西分门别类罗列的需求,比如一个餐厅,菜单(meal)分为开胃食物(Appetizer)、主菜(MainCourse)、甜点(Dessert)、咖啡(Coffee)。为了让程序更直观,可以这...
  • guyixiangxy
  • guyixiangxy
  • 2017年12月03日 10:10
  • 336

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

本以为RED只是一个Light类的一个static final的实例而已。但后然发现不是这样的 ,...
  • Sup_Heaven
  • Sup_Heaven
  • 2014年06月28日 13:37
  • 7829

Java Design Demo--枚举类型--避免嵌套过多

我们在初学时用过if--else的语句,也用过switch,但是你会发觉如果嵌套过多代码可读性变差。 如以下我们写过通过分数给学生成绩评级,简写后的代码如下 A示例 public c...
  • b275518834
  • b275518834
  • 2013年01月01日 11:29
  • 2961

关于java枚举使用和理解。

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

Java 枚举:switch 支持枚举

JDK1.5 才开始有枚举类型,同时可爱的 Java 组织丰富了 switch 语句:支持枚举。 定义一个枚举类 Color public enum Color { RED("re...
  • AndroidBluetooth
  • AndroidBluetooth
  • 2012年09月05日 18:04
  • 12872

java枚举常用场景小结

在java编程过程中,我们通常需要定义一些固定数量的常量,在jdk1.5以前,通常的做法是定义一个静态常量类,但自jdk1.5后,java引入了枚举(关键字enum,全称为 enumeration,值...
  • cndmss
  • cndmss
  • 2016年05月18日 10:10
  • 5549
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 88万+
    积分: 5831
    排名: 5512
    博客专栏
    music