Java Enum 个人见解

什么是Enum?

  • Enum(枚举)。
  • 枚举是一种规范它规范了参数的形式,这样就可以不用考虑类型的不匹配并且显的替代了int 型参数可能带来的模糊概念,枚举像一个类,又像一个数组。
Enum 作为 Sun公司全新引进的一个关键字,看起来很象是特殊的class,它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。
  1. 它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
  2. 所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
  3. Enum默认实现了 java.lang.Comparable接口。
  4. Enum覆载了toString()方法,因此我们如果调用 ColorEnum.RED.toString()则默认返回字符串 "RED"。
  5. Enum提供了一个valueOf()方法,这个方法和toString()方法是相对应的。调用valueOf("RED")则会默认返回ColorEnum.RED因此我们在自己重写toString()方法的时候就要注意到这一点,一搬来说也会相对应地重写valueOf()方法。
  6. 在比较两个枚举类型的值时,永远不需要调用equals方法,而直接使用"=="就可以了。(equals()方法也是直接使用 == , 两者是一样的效果)

Enum常见的方法

Enum是所有 Java 语言枚举类型的公共基本类(注意Enum是抽象类),以下是它的常见方法:

  1. compareTo(Enum e)    返回类型为  int    比较此枚举与指定对象的顺序

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
    public static void main(String[] args){
        System.out.println("比较此枚举与指定对象的顺序   为正则是大于对比下标位置序多少,为负则是小于他对比下标位置多少");
        System.out.println("YELLOW 对比 RED 位置顺序结果为:" + EnumDemoOne.YELLOW.compareTo(enumDemoOne));
        System.out.println("RED 对比 YELLOW 位置顺序结果为:" + EnumDemoOne.RED.compareTo(EnumDemoOne.YELLOW));
        /**
         * 比较此枚举与指定对象的顺序   为正则是大于对比下标位置序多少,为负则是小于他对比下标位置多少
         * YELLOW 对比 RED 位置顺序结果为:3
         * RED 对比 YELLOW 位置顺序结果为:-3
         */
    }}
    
    
    复制代码

  2. equals(Object other)    返回类型  boolean    当指定对象等于此枚举常量时,返回true。

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
        EnumDemoOne enumDemoOne = EnumDemoOne.RED;
    
        public static void main(String[] args){
            System.out.println("当指定对象等于此枚举常量时,返回 true。");
            System.out.println("RED.toString() 对等于 RED.toString() 时" + EnumDemoOne.RED.toString().equals(enumDemoOne.toString()));
            System.out.println("RED 对等于 RED 时" + EnumDemoOne.RED.equals(enumDemoOne));
            System.out.println("YELLOW 对等于 BLANK 时" + EnumDemoOne.YELLOW.equals(EnumDemoOne.BLANK));
            System.out.println("YELLOW.name() 对等于 BLANK.name() 时" + EnumDemoOne.YELLOW.name().equals(EnumDemoOne.BLANK.name()));
           /**
    	 * 当指定对象等于此枚举常量时,返回 true。
    	 * RED.toString() 对等于 RED.toString() 时true
    	 * RED 对等于 RED 时true
    	 * YELLOW 对等于 BLANK 时false
    	 * YELLOW.name() 对等于 BLANK.name() 时false
    	 */
        }
    }复制代码

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

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
        EnumDemoOne enumDemoOne = EnumDemoOne.RED;
    
        public static void main(String[] args){
            System.out.println("返回与此枚举常量的枚举类型相对应的 Class 对象");
    	System.out.println("RED 的枚举常量相对应的类型是:" + EnumDemoOne.RED.getDeclaringClass());
    	/**
    	 * 返回与此枚举常量的枚举类型相对应的 Class 对象
    	 * RED 的枚举常量相对应的类型是:class com.chenquan.demo.enum_demo.EnumDemoOne	
    	 */
        }
    }复制代码

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

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
        EnumDemoOne enumDemoOne = EnumDemoOne.RED;
    
        public static void main(String[] args){
           System.out.println("name() 返回此枚举常量的名称,在其枚举声明中对其进行声明\t" + EnumDemoOne.RED.name());
           /**
            * name() 返回此枚举常量的名称,在其枚举声明中对其进行声明	RED
            */
        }
    }复制代码

  5. toString()    返回类型 String    返回枚举常量的名称,它包含在声明中。我们在上文中提到:了Enum覆载了toString()方法,因此我们如果调用 ColorEnum.RED.toString()则默认返回字符串 "RED"。 可以发现。通过查看源码发现toString()name()方法其实都是返回Enum常量的名字

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
        EnumDemoOne enumDemoOne = EnumDemoOne.RED;
    
        public static void main(String[] args){
          System.out.println("toString() 返回枚举常量的名称,它包含在声明中\t" + EnumDemoOne.RED.toString());
           /**
            * toString() 返回枚举常量的名称,它包含在声明中	RED
            */
        }
    }复制代码
  6. ordinal()    返回类型  int    返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零) 该方法获取的是枚举变量在枚举类中声明的顺序,下标从0开始 在声明枚举的时候下标就会自己产生。

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
        EnumDemoOne enumDemoOne = EnumDemoOne.RED;
    
        public static void main(String[] args){
           System.out.println("ordinal() 得到枚举类型创建的顺序\t" + EnumDemoOne.RED.ordinal());
           System.out.println("ordinal() 得到枚举类型创建的顺序\t" + EnumDemoOne.GREEND.ordinal());
           /**
            * ordinal() 得到枚举类型创建的顺序	0
            * ordinal() 得到枚举类型创建的顺序	1
            */
        }
    }复制代码

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

public enum EnumDemoOne {
	RED, GREEND, BLANK, YELLOW
}


public class EnumTestOne {
    EnumDemoOne enumDemoOne = EnumDemoOne.RED;

    public static void main(String[] args){
        System.out.println("得到指定名称的常量名:" + EnumDemoOne.valueOf("RED"));
	System.out.println("得到指定名称的常量名:" + EnumDemoOne.valueOf("BLANK"));
	System.out.println("得到指定名称的常量名:" + EnumDemoOne.valueOf("YELLOW"));	
	/**
	 * 得到指定名称的常量名:RED
	 * 得到指定名称的常量名:BLANK
	 * 得到指定名称的常量名:YELLOW
	 */
    }
}复制代码



Enum一般做什么用?

  • 常量
        在以前Java SE5 之前,定义常量都是 public static final String RED; 有了枚举,就可            以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

/**颜色*/
public enum ColorEnum{
	RED, GREEND, BLANK, YELLOW;
}复制代码

/**星期*/
public enum WeekDayEnum{
     MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}复制代码

  • switch

        在JDK1.6之前switch循环只支持 int,char,enum。虽然在JDK1.7开始 加入了 String            类型但是使用枚举能让我们的代码可读性更强。而且枚举提供了比常量更多的方法。

public enum EnumDemoOne {
	RED, GREEND, BLANK, YELLOW;	
}

public class EnumTestOne {
	EnumDemoOne enumDemoOne = EnumDemoOne.RED;
	
	public void changeSwtich(){
		switch (enumDemoOne) {
		case RED:
			System.out.println(EnumDemoOne.RED + " 这是红色");
			break;
		case GREEND:
			System.out.println(EnumDemoOne.GREEND + " 这是绿色");
			break;
		case BLANK:
			System.out.println(EnumDemoOne.BLANK + " 这是白色");
			break;
		case YELLOW:
			System.out.println(EnumDemoOne.YELLOW + " 这是黄色");
			break;
		}
	}
}复制代码
  • 向enum类添加方法与自定义构造函数

              我们可以自己给Enum添加属性和方法。在添加时必须注意一点。必须要在定义完的                  枚举后面加上分号;

public enum EnumDemoSecond{
	RED("红"), GREEND("绿"), BLANK("白"), YELLOW("黄");
	
	private String description;

	// 构造方法
	private EnumDemoSecond(String description) {
		this.description = description;
	}
	
	/** set()方法  private 是为了防止外部随意调用修改*/
	private void setDescription(String description){
		this.description = description;
	}
	
	/** get()方法*/
	public String getDescription() {
		return description;
	}

	/**
	 * 重写 toString() 方法,让他返回的是属性的值
	 * */
	@Override
	public String toString() {
		return this.description;
	}


        public static void main(String[] args){
		
		/**
		 * 在重写 toString() 方法以前,toString() 和 name() 都是返回此枚举常量的名称 
		 * 但是现在重写了 toString()方法。返回的是自己定义的属性名称
		 * */
		for (EnumDemoSecond en : EnumDemoSecond.values()) {
			System.out.println("Enum常量名:" + en.name() + "\t Enum的自定义属性名:" + en.toString() );
		}
		/**
		 * Enum常量名:RED	 Enum的自定义属性名:红
		 * Enum常量名:GREEND	 Enum的自定义属性名:绿
		 * Enum常量名:BLANK	 Enum的自定义属性名:白
		 * Enum常量名:YELLOW	 Enum的自定义属性名:黄
		 */
	
	}

}复制代码

这是博主第一次开始学着写博客。。 写出了博主目前理解了的 内容。

本文许多内容出自: blog.csdn.net/javazejian/…  

如有理解错误地方请各位大佬指导。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值