enum总结

原创 2017年01月03日 19:24:00

1. 基本方法:

values: 可以遍历enum实例,返回enum实例的数组。

ordinal: 返回int 值,enum实例在声明时的次序,从0开始。

getDeclaringClass:得到实例所属的enum类。

name: 返回实例声明时的名字,等价于toString.

valueOf: 根据名字返回响应的enum实例,是static方法,如果不存在该名字,则抛出异常。


创建Enum实例时,编译器会生成继承于java.lang.Enum的类

Enum类实现了Comparable 和Serializable接口。

Enum类不能被继承。

enum的内部定义构造器一般为private,即使不是private,也只能在enmu的内部创建enum实例。


例子:

enum specialData
	{
		PSPROFILECHECK("PowerSuite Profile Check"),
		DIFFAIRPORTCHECK("Different Airports Check"),
		TRAVLEDOCUMENT("Travel Document"),
		CALLCARDVALIDATE("Calling Card Validation");
		
		private String context;
		private String getContext()
		{
			return this.context;
		}
		private specialData(String Context)
		{
			this.context = Context;
		}

		public String toString()
		{
			return this.context;
		}
	};


2. 特别的:

(1)enum 类继承于Enum类,但是Enum并没有values()方法。

原因:values()是由编译器自动添加的static方法,编译器同时还添加了只含有一个餐食的valueOf(Enum中的valueOf含有两个参数。)

(2)编译器会自动将enum类标记为final类

(3)Class中有个getEnumConstants()方法可以获取Enum的所有enum实例。

摘自《java 编程思想》

enum Explore{HERE,THERE}
public class EnumReflection {

	public static Set<String> analyze(Class<?> enumClass)
	{
		System.out.println("------Analyzing " + enumClass + "--------");
		System.out.println("Interface");
		for(Type t : enumClass.getGenericInterfaces())
		{
			System.out.println(t);
		}
		System.out.println("Base: " + enumClass.getSuperclass());
		System.out.println("Methods: ");
		Set<String> methods = new TreeSet<String>();
		for(Method m : enumClass.getMethods())
		{
			methods.add(m.getName());
		}
		System.out.println(methods);
		return methods;
	}
	
	public static void main(String[] args)
	{
		Set<String> exploreMethods = analyze(Explore.class);
		Set<String> enumMethods = analyze(Enum.class);
		System.out.println("Explore.containsAll(Enum)?" + exploreMethods.containsAll(enumMethods));
		System.out.println("exploreMethods.removeAll(enumMethods)");
		exploreMethods.removeAll(enumMethods);
		System.out.println(exploreMethods);
		OsExecute.command("javap Explore");
	}
}

3. Enum VS EnumSet:

(1)Enum是不能添加删除的Set,和Set一样成员唯一。

(2)EnumSet的原理:位向量,位向量能表示的元素个数与向量长度有关,一个byte可以表示8个元素,一个long型可以表示64个元素。

(3)EnumSet源码:

public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
implements Cloneable, java.io.Serializable
{
	 final Class<E> elementType;//类型信息
	 final Enum<?>[] universe;//所有的枚举
	 private static Enum<?>[] ZERO_LENGTH_ENUM_ARRAY = new Enum<?>[0];

	 EnumSet(Class<E>elementType, Enum<?>[] universe) {
	        this.elementType = elementType;
	        this.universe    = universe;
	    }
	 public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
	        Enum<?>[] universe = getUniverse(elementType);
	        if (universe == null)
	            throw new ClassCastException(elementType + " not an enum");

	        if (universe.length <= 64)
	            return new RegularEnumSet<>(elementType, universe);
	        else
	            return new JumboEnumSet<>(elementType, universe);
	    }
	 
	 public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) {
	        EnumSet<E> result = noneOf(elementType);
	        result.addAll();
	        return result;
	    }
	 
	 abstract void addAll();
	 
	 public static <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s) {
	        return s.clone();
	    }
	 
	    /**
	     * Returns all of the values comprising E.
	     * The result is uncloned, cached, and shared by all callers.
	     */
	    private static <E extends Enum<E>> E[] getUniverse(Class<E> elementType) {
	        return SharedSecrets.getJavaLangAccess()
	                                        .getEnumConstantsShared(elementType);
	    }
	    
	    /**
	     * This class is used to serialize all EnumSet instances, regardless of
	     * implementation type.  It captures their "logical contents" and they
	     * are reconstructed using public static factories.  This is necessary
	     * to ensure that the existence of a particular implementation type is
	     * an implementation detail.
	     *
	     * @serial include
	     */
	    private static class SerializationProxy <E extends Enum<E>>
	        implements java.io.Serializable
	    {
	        /**
	         * The element type of this enum set.
	         *
	         * @serial
	         */
	        private final Class<E> elementType;

	        /**
	         * The elements contained in this enum set.
	         *
	         * @serial
	         */
	        private final Enum<?>[] elements;

	        SerializationProxy(EnumSet<E> set) {
	            elementType = set.elementType;
	            elements = set.toArray(ZERO_LENGTH_ENUM_ARRAY);
	        }

	        // instead of cast to E, we should perhaps use elementType.cast()
	        // to avoid injection of forged stream, but it will slow the implementation
	        @SuppressWarnings("unchecked")
	        private Object readResolve() {
	            EnumSet<E> result = EnumSet.noneOf(elementType);
	            for (Enum<?> e : elements)
	                result.add((E)e);
	            return result;
	        }

	        private static final long serialVersionUID = 362491234563181265L;
	    }

	    Object writeReplace() {
	        return new SerializationProxy<>(this);
	    }

	    // readObject method for the serialization proxy pattern
	    // See Effective Java, Second Ed., Item 78.
	    private void readObject(java.io.ObjectInputStream stream)
	        throws java.io.InvalidObjectException {
	        throw new java.io.InvalidObjectException("Proxy required");
	    }
}

从源码中可以看出,EnumSet可以存储多于64个的元素。

所谓的add就是将对应元素设置为1,再与原来的值相或。

优点:节省空间,比Set效率高。


4.EnumMap

和Map的差别就是EnumMap的key值必须来源于enum类型,并且EnumMap保证顺序。

enum总结

一、用法介绍 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。 举个例子来说明一吧,为...
  • zephyr_be_brave
  • zephyr_be_brave
  • 2013年09月13日 21:00
  • 460

enum总结

12510 20 50100flag125解决掉(123456789)enum的组合用法,可解决用少量的枚举值解决大量的枚举值的作用。采用位域方式计算。C#在使用时有些小的技巧:位域通常用于由可组合出...
  • cxzhq2002
  • cxzhq2002
  • 2011年03月11日 12:08
  • 679

SDWebImage学习总结

SDWebImage是一个开源的第三方库,它提供了UIImageView的一个分类,以支持从远程服务器下载并缓存图片的功能。它具有以下功能 1 提供UIImageView的一个分类,以支持网络图片的...
  • u011774517
  • u011774517
  • 2016年10月13日 13:35
  • 505

C++11的enum class & enum struct和enum

C++标准文档——n2347(学习笔记) 链接:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf旧版enum存在的问...
  • sanoseiichirou
  • sanoseiichirou
  • 2015年12月04日 22:26
  • 3249

Java 枚举类Enum的用法总结

学过C/C++等语言的人,应该都对Enum类型略知一二。Enum一般用来表示一组相同类型的常量。如性别、日期、月份、颜色等。对这些属性用常 量的好处是显而易见的,不仅可以保证单例,且比较时候可以用”=...
  • anhuoren
  • anhuoren
  • 2014年11月20日 14:54
  • 3490

Enum扩展,可以包含多个属性

/** * 配置信息 * */ public enum ConfigType { PointsInvetee(5,"points.Invetee","30000","被邀请人获得的奖励积分...
  • danchejikafo
  • danchejikafo
  • 2016年11月29日 10:12
  • 365

C - enum和typedef enum的使用

在了解enum和typedef enum的区别之前先应该明白typedef的用法和意义。 C语言里typedef的解释是用来声明新的类型名来代替已有的类姓名,例如: typedef int   CHA...
  • superleexpert
  • superleexpert
  • 2012年06月13日 15:03
  • 26822

[转]Enum还是Enum Class(枚举类)

Enum还是Enum Class(枚举类)  marshine常量/枚举类型的表示系统中常常有一些属性的属性值是固定的一组值,它们的值域是封闭的(有限数量),比如国家代码(每个国家具有唯一的代码,而在...
  • yu_nan88
  • yu_nan88
  • 2005年01月25日 13:25
  • 3655

enum枚举总结

枚举详解 1.       什么是枚举enum 如果一个变量只有几个可能的值,则可以定义为枚举类型。所谓枚举就是将变量的值一一列出来,变量的值只限于列出来的范围内。 枚举同共用体类似,里面包...
  • jiangliuzheng
  • jiangliuzheng
  • 2012年12月28日 17:06
  • 763

Enum一点使用总结

枚举很有用, 总结一下它的两个重要操作和用途, 如下: 1.字符串转为Enum类型: 2.枚举作为标志     参考代码:     public enum MaleRoleEnum { ...
  • dingxingmei
  • dingxingmei
  • 2013年10月30日 16:33
  • 588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:enum总结
举报原因:
原因补充:

(最多只允许输入30个字)