Java 枚举使用方法

    JDK 5提供了enum关键字,实现了对枚举类型的支持。
    枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见。 例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,就是一个枚举。
    1.枚举的实现
     public enum Week {
 SUNDAY,
 MONDAY,
 TUESDAY,
 WEDNESDAY,
 THURSDAY,
 FRIDAY,
 SATURDAY;
}
    实现一个枚举是相当简单的,和实现一个类基本上差不多,只要使用enum这个关键字就可以了。枚举实际上继承了Enum这个抽象类,因为Java的单继承性,所以我们自己实现的枚举不能再继承别的类了。
   2.枚举的实用
     为了实用枚举,需要创建一个该类型的引用,并将其赋值给某个实例:
      Week week =Week. MONDAY ;
     尽管enum看起来像是一种新的数据类型,但是在很大程度上,我们可以讲enum当成一个普通类来处理。事实上enum确实是类,并且具有自己的方法。
      enum有一个特别适用的特性,就是和可以在switch语句内使用:
public static void main(String[] args) {
  Week week = Week.TUESDAY;
  switch(week){
  case SUNDAY:
   System.out.println("SUNDAY");
   break;
  case MONDAY:
   System.out.println("MONDAY");
   break;
  case TUESDAY:
   System.out.println("TUESDAY");
   break;
  case THURSDAY:
   System.out.println("THURSDAY");
   break;
  case WEDNESDAY:
   System.out.println("WEDNESDAY");
   break;
  case FRIDAY:
   System.out.println("FRIDAY");
   break;
  case SATURDAY:
   System.out.println("SATURDAY");
   break;
  }
 }
    3.枚举中添加新方法
      如果打算自定义自己的方法,那么必须在enum 实例序列的最后添加一个分号。而且   Java   要求必须先定义   enum 实例。 因为枚举实际上继承了Enum,所以可以覆盖父类中的一些方法,通常我们会覆盖toString(),以此来方便调试。
     public enum Week {
 //必须先定义实例,并以分好结束实例的定义
 SUNDAY(0,"星期天"),
 MONDAY(1,"星期一"),
 TUESDAY(2,"星期二"),
 WEDNESDAY(3,"星期三"),
 THURSDAY(4,"星期四"),
 FRIDAY(5,"星期五"),
 SATURDAY(6,"星期六");
 
 // 成员变量
 private String name;
 private int value;
 
 //构造方法 且不能是public,否则编译出错
 Week(int value, String name){
  this.name = name;
  this.value = value;
 }
 
 public String getName() {
  return name;
 }
 public int getValue() {
  return value;
 }
 
 @Override
 public String toString() {
  return name + ":" +value;
 }
 public static void main(String[] args) {
  Week week = Week.TUESDAY;
  switch(week){
  case SUNDAY:
   System.out.println("SUNDAY");
   break;
  case MONDAY:
   System.out.println("MONDAY");
   break;
  case TUESDAY:
   System.out.println("TUESDAY");
   break;
  case THURSDAY:
   System.out.println("THURSDAY");
   break;
  case WEDNESDAY:
   System.out.println("WEDNESDAY");
   break;
  case FRIDAY:
   System.out.println("FRIDAY");
   break;
  case SATURDAY:
   System.out.println("SATURDAY");
   break;
  }
 }
}

    4.枚举实现接口
      枚举可以当做一个普通类,所以可以像普通类一样来实现接口,实现接口的方法也和普通类一样
       interface Info{
         public String getInfo();
       }
       public enum Week implements Info{
        @Override
 public String getInfo() {
  return null;
 }
        }

    5.遍历枚举
     枚举提供了values()方法,可以用这个方法很轻松的实现多枚举的遍历
 for(Week w : Week.values()){
   System.out.println(w);
  }
      因为我们覆盖了toString(),所以输出结果为:
        星期天:0
星期一:1
星期二:2
星期三:3
星期四:4
星期五:5
星期六:6
     值得补充的一点是:values()方法是编译器插入到enum定义中的static方法。所以,当你将enum实例向上转型为父类Enum时,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有的enum实例。 

      6.
EnumMap
        public class EnumMap<K extends Enum<K>,V>
        extends AbstractMap<K,V>
        implements Serializable, Cloneable
        如下例:
                //以枚举类型当key,必须指定类型
                EnumMap<Week, String> map = new EnumMap<Week, String>(Week.class);
		map.put(MONDAY, "一");
		map.put(TUESDAY, "二");
		map.put(WEDNESDAY, "三");
		map.put(THURSDAY, "四");
		map.put(FRIDAY, "五");
		map.put(SATURDAY, "六");
		map.put(SUNDAY, "七");

    7.Enumset
  
  
public abstract class EnumSet<E extends Enum<E>>
  
  
extends AbstractSet<E>
  
  
implements Cloneable, Serializable

与枚举类型一起使用的专用 Set 实现。枚举 set 中所有键都必须来自单个枚举类型,该枚举类型在创建 set 时显式或隐式地指定。枚举 set 在内部表示为位向量。此表示形式非常紧凑且高效。此类的空间和时间性能应该很好,足以用作传统上基于 int 的“位标志”的替换形式,具有高品质、类型安全的优势。如果其参数也是一个枚举 set,则批量操作(如 containsAll 和 retainAll)也应运行得非常快。

此类可以帮助我们建立枚举值的集合,里面提供了一系列的静态方法,可以指定不同的集合建立方式。

  
  
public static <E extends Enum<E>> EnumSet<E> of(E first,
  
  
                                                E... rest)
  
  
创建一个最初包含指定元素的枚举 set。此工厂方法的参数列表使用变量参数功能,该方法可以创建一个最初包含任意个元素的枚举 set,但是这样很可能比不使用变量参数的重载运行得慢。
  
  
参数:
  
  
first - 此 set 最初要包含的元素
  
  
rest - 此 set 最初要包含的其余元素
  
  
返回:
  
  
最初包含指定元素的枚举 set
  
  
抛出:
  
  
NullPointerException - 如果任意参数为 null,或 rest 为 null
  
  
EnumSet<Week> set = EnumSet.of(MONDAY,TUESDAY);
  
  

  
  
  
  
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType)
  
  
创建一个具有指定元素类型的空枚举 set。
  
  
参数:
  
  
elementType - 此枚举 set 的元素类型的 class 对象
  
  
抛出:
  
  
NullPointerException - 如果 elementType 为 null
  
  
     EnumSet<Week> set2 = EnumSet.noneOf(Week.class);
   
   
set2.add(MONDAY);
   
   
f
8 .枚举中定义抽象方法


SUNDAY(0,"星期天") {
@Override
public void print() {
// TODO Auto-generated method stub
}
},
MONDAY(1,"星期一") {
@Override
public void print() {
}
},
TUESDAY(2,"星期二") {
@Override
public void print() {
}
},
WEDNESDAY(3,"星期三") {
@Override
public void print() {
}
},
THURSDAY(4,"星期四") {
@Override
public void print() {
}
},
FRIDAY(5,"星期五") {
@Override
public void print() {
}
},
SATURDAY(6,"星期六") {
@Override
public void print() {
}
};
public abstract void print();

 
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值