Java基础系列:(2)关于枚举的简单总结

简介:

一 枚举类型简介

       在JDK1.5之前,Java是没有枚举类型的,只有:类和接口。当然,在一般情况下这两种类型就已经足够了,不过在某些特殊情况下就显得有点不合适了。比如:“春夏秋冬”组成的四季这个“数据集”就不能有其他元素;定义一个Color类,它只能有Red,Green,Blue这3个值。像这样只有几个固定的元素组成的“数据集”,其他的任何值都是非法的,这时我们就可以使用枚举类型。

       enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。如果想要在JDK1.5之前实现类似枚举的功能,就必须依靠类似以下这种代码来完成。

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
package  javase.enumdemo;
 
public  class  Color {
     /**
      * 定义三个实例化对象,同时构造方法私有化,外部想要取得Color类的实例
      * 就只能通过RED,GREEN和BLUE这三个对象
      * */
     public  static  final  Color RED =  new  Color( "红色" );
     public  static  final  Color GREEN =  new  Color( "绿色" );
     public  static  final  Color BLUE =  new  Color( "蓝色" );
     private  String name;
     /**
      * 构造方法私有化
      * */
     private  Color(String name) {
         this .name = name;
     }
 
     public  String getName() {
         return  name;
     }
 
     public  void  setName(String name) {
         this .name = name;
     }
 
     public  static  void  main(String[] args) {
         Color color_1 = Color.RED;
         System.out.println(color_1.getName());
 
     }
 
}

输出:

1
 

       以上的代码还是有不少问题的,最明显的一点是:如果用户想要知道到底有多少种颜色可以使用,其实现的代码就不是那么简单,更别说加入到集合进行操作了。因此,枚举就是为了解决这些问题而产生的。

二 枚举类型的定义和常用方法

(1)定义:

[public] enum 枚举类型名称{

        枚举对象1,枚举对象2,…,枚举对象n;

}

实例:

1
2
3
4
5
6
7
8
package  javase.enumdemo;
 
public  enum  Color_2 {
     /**
      * 定义了3个枚举类型
      * */
     RED,GREEN,BLUE;
}

(2)常用方法示例:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package  javase.enumdemo;
 
public  class  Color_2Demo {
     /**
      * 取出枚举内容
      * */
     public  void  getEnumContent() {
         Color_2 color = Color_2.RED;
         System.out.println(color);
     }
 
     /**
      * 遍历所有枚举内容
      * */
     public  void  forEachEnum() {
         for  (Color_2 color : Color_2.values())
             System.out.println(color);
     }
 
     /**
      * switch判断
      * */
     public  void  switchPrintEnum() {
         for  (Color_2 color : Color_2.values()) {
             switch  (color) {
             case  RED:
                 System.out.println( "红色" );
                 break ;
 
             case  GREEN:
                 System.out.println( "绿色" );
                 break ;
                 
             case  BLUE:
                 System.out.println( "蓝色" );
                 break ;
                 
             default :
                 System.out.println( "未知颜色" );
                 break ;
             }
         }
     }
 
     /**
      * 测试枚举的ordinal()和name()方法
      * */
     public  void  ordinalTest(){
         for (Color_2 color : Color_2.values()){
             //color.ordinal()  返回枚举常量的序数
             //color.name()     返回枚举常量的名称
             System.out.println(color.ordinal() +  " --> "  + color.name());
         }
     }
     
     public  static  void  main(String[] args) {
         Color_2Demo color_2Demo =  new  Color_2Demo();
         color_2Demo.getEnumContent();
         System.out.println( "******************http://www.zifangsky.cn**********************" );
 
         color_2Demo.forEachEnum();
         System.out.println( "******************http://www.zifangsky.cn**********************" );
 
         color_2Demo.switchPrintEnum();
         System.out.println( "******************http://www.zifangsky.cn**********************" );
         
         color_2Demo.ordinalTest();
 
     }
 
}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
RED
******************http: //www.zifangsky.cn**********************
RED
GREEN
BLUE
******************http: //www.zifangsky.cn**********************
红色
绿色
蓝色
******************http: //www.zifangsky.cn**********************
0  --> RED
1  --> GREEN
2  --> BLUE

三 为每一个枚举对象属性赋值

(1)通过构造方法为属性赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package  javase.enumdemo;
 
public  enum  Color_3 {
     RED( "红色" ),GREEN( "绿色" ),BLUE( "蓝色" );
     private  String name;
 
     /**
      * 为枚举对象属性赋值
      * 第一种方式,通过构造方法
      * */
     private  Color_3(String name) {
         this .name = name;
     }
 
     public  String getName() {
         return  name;
     }
 
     public  void  setName(String name) {
         this .name = name;
     }
     
}

测试:

1
2
3
4
5
6
7
8
9
10
11
package  javase.enumdemo;
 
public  class  Color_3Demo {
 
     public  static  void  main(String[] args) {
         for  (Color_3 color : Color_3.values())
             System.out.println(color.ordinal() +  " --> "  + color.name() +  "("
                     + color.getName() +  ")" );
     }
 
}

输出:

1
2
3
0  --> RED(红色)
1  --> GREEN(绿色)
2  --> BLUE(蓝色)

(2)通过setter方法为属性赋值

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
package  javase.enumdemo;
 
public  enum  Color_4 {
     RED,GREEN,BLUE;
     private  String name;
 
     public  String getName() {
         return  name;
     }
     /**
      * 为枚举对象属性赋值
      * 第二种方式,通过setter方法
      * */
     public  void  setName(String name) {
         switch  ( this ) {
         case  RED:
             if ( "红色" .equals(name))
                 this .name = name;
             else
                 System.out.println( "设置属性名称不恰当" );
             break ;
             
         case  GREEN:
             if ( "绿色" .equals(name))
                 this .name = name;
             else
                 System.out.println( "设置属性名称不恰当" );
             break ;
 
         case  BLUE:
             if ( "蓝色" .equals(name))
                 this .name = name;
             else
                 System.out.println( "设置属性名称不恰当" );
             break ;
     
         default :
             break ;
         }
     }
     
}

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package  javase.enumdemo;
 
public  class  Color_4Demo {
 
     public  static  void  main(String[] args) {
         Color_4 color = Color_4.BLUE;
         color.setName( "红色" );
         System.out.println(color.getName());   //设置不恰当,输出为:null
         
         color.setName( "蓝色" );
         System.out.println(color.getName());
 
     }
 
}

输出:

1
2
3
设置属性名称不恰当
null
蓝色

四 类集对枚举的支持——EnumMap和EnumSet

(1)EnumMap的简单使用

i)构造方法如下:

public EnumMap(Class<K> keyType)

ii)简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package  javase.enumdemo;
 
import  java.util.EnumMap;
import  java.util.Map;
 
enum  Color_5 {
     RED, GREEN, BLUE;
}
 
public  class  EnumMapDemo {
     public  static  void  main(String[] args) {
         Map<Color_5, String> map =  new  EnumMap<Color_5, String>(Color_5. class );
         map.put(Color_5.RED,  "红色" );
         map.put(Color_5.BLUE,  "蓝色" );
          //遍历
         for  (Map.Entry<Color_5, String> mapEntry : map.entrySet())
             System.out.println(mapEntry.getKey().name() +  " --> "
                     + mapEntry.getValue());
     }
 
}

出:

1
2
RED --> 红色
BLUE --> 蓝色

(2)EnumSet的几种常用方法示例:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package  javase.enumdemo;
 
import  java.util.EnumSet;
 
public  class  EnumSetDemo {
     /**
      * 将全部枚举类型添加到EnumSet集合中
      * */
     public  void  allOfTest(){
         EnumSet<Color_5> set = EnumSet.allOf(Color_5. class );
         for (Color_5 color : set)
             System.out.print(color +  "\t" );
         System.out.println();
     }
     
     /**
      * 只设置一个枚举类型到集合中
      * */
     public  void  ofTest(){
         EnumSet<Color_5> set = EnumSet.of(Color_5.BLUE);
         for (Color_5 color : set)
             System.out.println(color);
     }
     
     /**
      * 创建一个只能添加指定内容的空集合
      * */
     public  void  noneOfTest(){
         EnumSet<Color_5> set = EnumSet.noneOf(Color_5. class );
         set.add(Color_5.RED);
         set.add(Color_5.GREEN);
         
         for (Color_5 color : set)
             System.out.print(color +  "\t" );
         System.out.println();
         
     }
     
     /**
      * 创建不包含指定元素的集合
      * */
     public  void  complementOfTest(){
         EnumSet<Color_5> oldSet = EnumSet.of(Color_5.BLUE,Color_5.GREEN);
         EnumSet<Color_5> newSet = EnumSet.complementOf(oldSet);
         
         for (Color_5 color : newSet)
             System.out.print(color +  "\t" );
         System.out.println();
     }
     
     /**
      * 复制已有集合中的内容
      * */
     public  void  copyOfTest(){
         EnumSet<Color_5> oldSet = EnumSet.of(Color_5.RED,Color_5.GREEN);
         EnumSet<Color_5> newSet = EnumSet.copyOf(oldSet);
         
         for (Color_5 color : newSet)
             System.out.print(color +  "\t" );
         System.out.println();
     }
     
     
     public  static  void  main(String[] args) {
         EnumSetDemo enumSetDemo =  new  EnumSetDemo();
         enumSetDemo.allOfTest();
         System.out.println( "******************http://www.zifangsky.cn**********************" );
         
         enumSetDemo.ofTest();
         System.out.println( "******************http://www.zifangsky.cn**********************" );
         
         enumSetDemo.noneOfTest();
         System.out.println( "******************http://www.zifangsky.cn**********************" );
         
         enumSetDemo.complementOfTest();
         System.out.println( "******************http://www.zifangsky.cn**********************" );
         
         enumSetDemo.copyOfTest();
     }
 
}

输出:

1
2
3
4
5
6
7
8
9
RED GREEN   BLUE   
******************http: //www.zifangsky.cn**********************
BLUE
******************http: //www.zifangsky.cn**********************
RED GREEN  
******************http: //www.zifangsky.cn**********************
RED
******************http: //www.zifangsky.cn**********************
RED GREEN  

五 让枚举类实现一个接口

       枚举类实现一个接口,因为接口中含有抽象方法,因此枚举类中的每个对象都需要分别实现接口中的抽象方法,示例代码如下:

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
package  javase.enumdemo;
 
interface  Print{
     public  String getColor();
}
/**
  * 枚举类实现了一个接口Print
  * 因此枚举类中的每个对象都必须分别实现接口中的抽象方法
  * */
enum  Page  implements  Print{
     WHITEPAGE{
         public  String getColor() {
             return  "白色" ;
         }  
     },BLUEPAGE{
         public  String getColor() {
             return  "蓝色" ;
         }
     },GRAYPAGE{
         public  String getColor() {
             return  "灰色" ;
         }
     };
 
}
 
public  class  InterfaceEnumDemo {
     public  static  void  main(String[] args) {
         Page page = Page.GRAYPAGE;
         System.out.println(page.getColor());
     }
 
}

输出:

1
 

六 在枚举类中定义抽象方法

       跟前面枚举类实现一个接口类似,也需要枚举类中的每个对象分别实现其抽象方法,示例代码如下:

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
package  javase.enumdemo;
 
/**
  * 枚举中定义抽象方法
  * 同样,枚举类中的每个对象都必须分别实现该抽象方法
  * */
enum  Person{
     STUDENT{
         public  String getJobName() {
             return  "学生" ;
         }  
     },TEACHER{
         public  String getJobName() {
             return  "教师" ;
         }
     },PROGRAMMER{
         public  String getJobName() {
             return  "程序猿" ;
         }
     };
     public  abstract  String getJobName();   //抽象方法
}
 
public  class  AbstractMethodDemo {
     public  static  void  main(String[] args) {
         Person person = Person.PROGRAMMER;
         System.out.println(person.getJobName());
     }
 
}

输出:

1
程序猿


本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1740586,如需转载请自行联系原作者
相关文章
|
1月前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
121 60
|
29天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
51 24
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
91 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
3月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
77 9
Java——反射&枚举
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
|
3月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
94 5
|
3月前
|
安全 Java 开发者
Java 枚举(enum)详解
Java 中的枚举(`enum`)是一种特殊的数据类型,用于定义一组固定的常量,提升代码的类型安全性和可读性。枚举使用 `enum` 关键字定义,支持方法和构造函数,具有类型安全、单例、自动序列化等特点,并且可以遍历和用于 `switch` 语句中。实际应用包括状态机、指令集、类型标识等场景。枚举使代码更加清晰易维护。
254 1
|
4月前
|
Java
Java枚举使用的基本案例
这篇文章是关于Java枚举的基本使用,通过一个指令下发的代码案例,展示了如何定义枚举、使用枚举以及如何通过枚举实现指令的匹配和处理。
|
4月前
|
Java 开发者
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案。本文通过技术综述及示例代码,剖析两者在性能上的差异。if-else具有短路特性,但条件增多时JVM会优化提升性能;switch则利用跳转表机制,在处理大量固定选项时表现出色。通过实验对比可见,switch在重复case值处理上通常更快。尽管如此,选择时还需兼顾代码的可读性和维护性。理解这些细节有助于开发者编写出既高效又优雅的Java代码。
66 2
|
4月前
|
安全 Java 编译器