好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java枚举类型-Enum

前言

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

应用

定义

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

?

1

2

3

enum WeekEnum {

     Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend

}

基本Enum特性

枚举类的定义

?

1

2

3

4

5

6

7

8

9

10

11

12

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 实例

?

1

2

3

4

5

6

7

8

9

10

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 方法。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

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

正确用法

?

1

2

3

4

5

6

7

8

9

WeekEnum weekEnum = WeekEnum.Friday;

 

switch (weekEnum) {

    case Friday:

        System.out.println(weekEnum);

        break ;

    case Saturday:

        break ;

}

错误用法

?

1

2

3

4

5

6

7

8

9

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不能继承其他类,但可以实现一个或多个接口。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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 。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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中的顺序。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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 方法。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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();

         }

     }

 

}

枚举值向枚举类型转换

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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

     }

 

}

以上就是java枚举类型-Enum的详细内容,更多关于java Enum的资料请关注其它相关文章!

原文链接:https://www.cnblogs.com/maggieq8324/p/15177334.html

查看更多关于java枚举类型-Enum的详细内容...

  阅读:17次