软件编程
位置:首页>> 软件编程>> java编程>> java枚举类型-Enum

java枚举类型-Enum

作者:Maggieq8324  发布时间:2021-07-11 00:56:47 

标签:java,Enum,枚举类型
目录
  • 前言

  • 应用

    • 定义

    • 基本Enum特性

    • Enum的静态导入

    • Enum中添加新方法

    • Switch语句中的Enum

    • Enum的继承

    • EnumSet的使用

    • EnumMap的使用

    • 常量相关方法

    • 枚举值向枚举类型转换

前言

枚举是 Java1.5 引入的新特性,通过关键字 enum 来定义枚举类。

应用

定义

  • 关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。


enum WeekEnum {
   Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend
}

基本Enum特性

  • 枚举类的定义


enum WeekEnum {
   Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend;

public static void main(String[] args) {
       for (WeekEnum item : WeekEnum.values()) {
           System.out.println(item.ordinal());
           System.out.println(item.name());
           System.out.println(item.getDeclaringClass());
           System.out.println(Enum.valueOf(WeekEnum.class, item.name()));
       }
   }
}

  • 常用方法

方法说明
values()可以遍历enum实例,其返回enum实例的数组
ordinal()返回每个实例在声明时的次序
name()返回enum实例声明时的名称
getDeclaringClass()返回其所属的enum类
Enum.valueOf()根据给定的名称返回相应的enum实例

Enum的静态导入

  • static import 可以将 enum 实例的标识符带入当前类,无需再用enum类型来修饰 enum 实例


import static com.coisini.springbootlearn.WeekEnum.*;

public class WeekEnumTest {

public static void main(String[] args) {
       System.out.println(Monday.name()); // Monday
       System.out.println(Tuesday.name()); //Tuesday
   }

}

Enum中添加新方法

  • Enum 可以看做是一个常规类(除了不能继承自一个enum),enum 中可以添加方法和 main 方法。


public enum WeekEnum {

Monday(1, "周一"),
   Tuesday(2, "周二"),
   Wednesday(3, "周三"),
   Thursday(4, "周四"),
   Friday(5, "周五"),
   Saturday(6, "周六"),
   weekend(7, "周天");

private Integer value;
   private String description;

/**
    * 构造方法
    * @param value
    * @param description
    */
   WeekEnum(Integer value, String description) {
       this.value = value;
       this.description = description;
   }

/**
    * 获取value
    * @return
    */
   public Integer getValue() { return this.value; }

/**
    * 获取Desc
    * @return
    */
   public String getDesc() { return this.description; }

/**
    * 重写ToString方法
    * @return
    */
   public String toString() {
       return this.getValue() + " " + this.getDesc();
   }

public static void main(String[] args) {
       for (WeekEnum item : WeekEnum.values()) {
           System.out.println(item);
       }
   }

}

Switch语句中的Enum

  • 正确用法


WeekEnum weekEnum = WeekEnum.Friday;

switch (weekEnum) {
  case Friday:
      System.out.println(weekEnum);
      break;
  case Saturday:
      break;
}

  • 错误用法


WeekEnum weekEnum = WeekEnum.Friday;

switch(weekEnum) {
// An enum switch case label must be the unqualified name of an enumeration constant
  case WeekEnum.Friday:
      break;
  default:
      break;
}

  • 常规情况下必须使用 enum 类型来修饰 enum 实例,但在 case 语句中不必如此。

Enum的继承

  • 所有的enum都继承自java.lang.Enum类,由于Java不支持多重继承,所以enum不能继承其他类,但可以实现一个或多个接口。


public interface Period {

enum WeekEnum implements Period{
       Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend
   }

enum MonthEnum implements Period{
       January, February, March, April, May, June
   }

class PeriodTest {
       public static void main(String[] args) {
           Period week = WeekEnum.Friday;
           Period month = MonthEnum.April;

System.out.println(month + " " + week); // April Friday
       }
   }

}

EnumSet的使用

  • enum 中不能删除和添加元素,Java SE5 引入了EnumSet,其元素必须来自一个 enum 。


import java.util.EnumSet;

enum EnumSetTest {
   Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend;

public static void main(String[] args) {
       EnumSet<EnumSetTest> points = EnumSet.noneOf(EnumSetTest.class);
       points.add(Monday);
       System.out.println(points); // [Monday]

points.addAll(EnumSet.of(Tuesday, Wednesday));
       System.out.println(points); // [Monday, Tuesday, Wednesday]

points = EnumSet.allOf(EnumSetTest.class);
       System.out.println(points); // [Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend]

points.removeAll(EnumSet.of(Monday, Tuesday));
       System.out.println(points); // [Wednesday, Thursday, Friday, Saturday, weekend]

points = EnumSet.complementOf(points);
       System.out.println(points); // [Monday, Tuesday]
   }
}

EnumMap的使用

  • EnumMap 是一种特殊的 Map,其 key 值必须来自一个 enum,enum 实例定义的次序决定了其在EnumMap中的顺序。


import java.util.EnumMap;
import java.util.Map;

public enum EnumMapTest {
   MON, TUE, WED, THU, FRI, SAT, WEE;

public static void main(String[] args) {
       EnumMap<EnumMapTest, String> enumMap = new EnumMap<EnumMapTest, String>(EnumMapTest.class);
       enumMap.put(MON, "Monday");
       enumMap.put(TUE, "Tuesday");

for (Map.Entry<EnumMapTest, String> em : enumMap.entrySet()) {
           System.out.println(em.getKey() + " " + em.getValue()); // MON Monday TUE Tuesday
       }
   }
}

常量相关方法

  • enum 允许为 enum 实例编写方法,为每个 enum 实例赋予不同的行为,要实现常量的相关方法需要为 enum 定义- 实现 abstract 方法。


public enum EnumAbstract {
   MON {
       void getDetail() {
           System.out.println("Monday");
       }
   },
   TUE {
       void getDetail() {
           System.out.println("Tuesday");
       }
   },
   WED {
       void getDetail() {
           System.out.println("Wednesday");
       }
   };

abstract void getDetail();

public static void main(String[] args) {
       for (EnumAbstract ea : EnumAbstract.values()) {
           ea.getDetail();
       }
   }

}

枚举值向枚举类型转换


import java.util.stream.Stream;

public enum WeekEnum {

Monday(1, "周一"),
   Tuesday(2, "周二"),
   Wednesday(3, "周三"),
   Thursday(4, "周四"),
   Friday(5, "周五"),
   Saturday(6, "周六"),
   weekend(7, "周天");

private Integer value;
   private String description;

/**
    * 构造方法
    * @param value
    * @param description
    */
   WeekEnum(Integer value, String description) {
       this.value = value;
       this.description = description;
   }

/**
    * 枚举值向枚举类型转换
    * @param value
    * @return
    */
   public static WeekEnum toWeekEnum(int value) {
       return Stream.of(WeekEnum.values())
               .filter(item -> item.value == value)
               .findAny()
               .orElse(null);
   }

public static void main(String[] args) {
       System.out.println(WeekEnum.toWeekEnum(1)); // Monday
   }

}

来源:https://www.cnblogs.com/maggieq8324/p/15177334.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com