zoukankan      html  css  js  c++  java
  • Java基础之枚举

    Java基础之枚举

    作为1.5才增加的特性,枚举的使用并不是很多。

    枚举其实就是一个比较特殊的类,就如同注解其实也是个特殊的接口一样(注解反编译之后没有了@符号)。枚举使用enum关键字声明,通过反编译自定义的枚举可以看到类似下面的代码:

    //源代码
    public enum Sex {
        MAN,WOMAN;//如果下面需要定义方法,这里需要加一个分号
    }
    
    //反编译结果
    public final class Sex extends Enum
    {
    
    	public static final Sex MAN;
    	public static final Sex WOMAN;
    	private static final Sex $VALUES[];
    
    	public static Sex[] values(){
    		return (Sex[])$VALUES.clone();
    	}
    
    	public static Sex valueOf(String s){
    		return (Sex)Enum.valueOf(Sex, s);
    	}
    
    	private Sex(String s, int i){
    		super(s, i);
    	}
    
    	static {
    		MAN = new Sex("MAN", 0);
    		WOMAN = new Sex("WOMAN", 1);
    		$VALUES = (new Sex[] {
    			MAN, WOMAN
    		});
    	}
    }
    

    可以通过反编译结果看到:

    • 自动继承了Enum类
    • 编译器添加了构造方法并私有化
    • MAN,WOMAN被声明为为静态自身类型常量,并且在静态代码块中实例化
    • 添加了values()valueOf()方法

    同时,枚举中也可以定义构造方法、成员方法、成员变量、构造代码块、静态代码块等普通类所能定义的东西。但是构造方法必须私有(可以不加权限限定词但默认为private,构造方法既可以有参也可以无参)

    常用方法:

    • 继承自Enum类:
      • name():返回枚举常量名称
      • ordinal():返回枚举常量的序号
    • 自身方法(静态):
      • values():返回自身的常量数组
      • valueOf():由字符串转化为枚举

    枚举在switch中的注意事项:

    Sex sex = Sex.MAN;
    switch (sex) {
        case MAN://注意这里,这里不能写Sex.MAN,而是用MAN
            System.out.println("man");
            break;
        case WOMAN:
            System.out.println("woman");
            break;
        default:
            System.out.println("error");
    }
    

    实际上使用枚举可以很方便的构建单例模式:详见这篇博文

  • 相关阅读:
    asp.net(.net 4.0)+ json 分页
    在两张表(A表和B表)里面找出A中不存在B表的记录
    linq to sql 的List<Table> 数据表缓存
    linq 并发冲突概念
    阿里RocketMq节约成本
    阿里巴巴java手册异常日志
    阿里巴巴java手册安全规约
    阿里巴巴java手册单元测试
    Spring boot自定义starter
    MongoDB权限
  • 原文地址:https://www.cnblogs.com/lixin-link/p/11222045.html
Copyright © 2011-2022 走看看