`
liuluo129
  • 浏览: 116497 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java枚举

    博客分类:
  • java
 
阅读更多

Java在1.5之后,有了enum关键字,定义枚举类。它是一种特殊的类,同样可以有方法和属性,可以实现一个或多个接口,可以定义构造器。它与普通类区别:

1.枚举类可实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是Object类。而java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。

2.枚举类的构造器只能使用private访问控制符,省略则默认为private,指定也只能指定private。

3.枚举类的所有实例必须在枚举类中显式列出。系统自动添加public static final修饰符。

4.所有枚举类都提供了一个values方法,方便遍历所有的枚举值。

使用enum关键字创建EnumSeason,如下:

 

1 enum EnumSeason  {
2    SPRING, SUMMER, FALL, WINTER
3 }

替代使用String定义常量:

 

1 public class EnumSeason  {
2    public static final String SPRING = “SPRING”;
3    public static final String SUMMER = “SUMMER”;
4    public static final String FALL = “FALL”;
5    public static final String WINTER = “WINTER”;
6 }

由于使用字符串常量这种方式是编译时常量,即在.java文件在编译成.class时,会把这些常量替换为相应的值。这样其他的类里有引用到的时候也会被替换,如果字符串常量发生改变了,那么其他的类也要重新进行编译。而枚举是运行时,枚举类改变后,只需要重新编译枚举类即可。

使用枚举类:

 

01 public static void main(String[] args) {
02     judge(EnumSeason.SPRING);
03     for (EnumSeason s : EnumSeason.values()) {
04         System.out.println(s.ordinal() + ":" + s);
05     }
06 }
07 public static void judge(EnumSeason season) {
08     switch (season) {
09         case SPRING:
10             System.out.println("春暖花开");
11             break;
12         case SUMMER:
13             System.out.println("夏日温情");
14             break;
15         case FALL:
16             System.out.println("秋高气爽");
17             break;
18         case WINTER:
19             System.out.println("东风瑟瑟");
20         default:
21             System.out.println("什么呀这是");
22     }
23 }

 

运行结果如下:

春暖花开

0:SPRING

1:SUMMER

2:FALL

3:WINTER

为枚举类添加属性,如下:

 

1 enum Gender {
2     MALE, FEMALE;
3     public String name;
4 }

 

使用如下:

 

1 Gender g = Enum.valueOf(Gender.class"FEMALE");
2 g.name = "女";
3 System.out.println(g + "代表:" + g.name);

 

Enum类的静态方法valueOf(Class,  String)

上面直接访问enum属性的方式不太安全,可以改为添加setter/getter方法:

 

01 enum Gender {
02     MALE, FEMALE;
03     private String name;
04  
05     public String getName() {
06         return name;
07     }
08  
09     public void setName(String name) {
10         switch(this) {
11         case MALE:
12             if("男".equals(name)){
13                 this.name = name;
14             else {
15                 System.out.println("参数错误");
16                 return;
17             }
18             break;
19         case FEMALE:
20             if("女".equals(name)){
21                 this.name = name;
22             else {
23                 System.out.println("参数错误");
24                 return;
25             }
26             break;
27         }
28     }
29 }

 

主函数如下:

 

1 Gender g = Enum.valueOf(Gender.class"FEMALE");
2 g.setName("女");
3 System.out.println(g + "代表:" + g.getName());
4  
5 g.setName("男"); //参数错误
6 System.out.println(g + "代表:" + g.getName());

 

这种方法仍不够科学,因为枚举类通常设计成不可变类,即属性值不允许修改,这样更安全,因此应该把枚举类的属性都使用private final修饰。可使用private构造函数方式,如下:

 

1 enum Gender {
2     MALE("男"), FEMALE;
3     private final String name;
4      
5     private Gender(String name) {
6         this.name = name;
7     }
8 }

 

Enum枚举实现接口,例子如下:因为有了构造函数,因此枚举变量中每个值都得使用构造函数方式,因此MALE("男")没有问题,而FEMALE就编译通不过,因为没有无参的构造函数。

 

01 interface InterfaceForEnum {
02     public void fun();
03 }
04  
05 enum EmotionEnum implements InterfaceForEnum{
06     HAPPY, ANGRY;
07  
08     @Override
09     public void fun() {
10         System.out.println("I'm an emotion");
11     }
12 }

 

这种方式,每个枚举值调用fun()方法时,行为就一样了,没能达到接口效果,可改为如下:

 

01 enum EmotionEnum implements InterfaceForEnum{
02     HAPPY {
03         public void fun() {
04             System.out.println("I'm very happy");
05         }
06     }
07     , ANGRY {
08  
09         @Override
10         public void fun() {
11             System.out.println("I'm angry");
12         }
13     }
14 }

同样,也可以在enum中定义抽象方法,这样每个枚举值都得实现该抽象方法。

01 enum EmotionEnum {
02     HAPPY {
03         public int evel(int n1, int n2) {
04             return n1 - n2;
05         }
06     }
07     , ANGRY {
08          
09         public int evel(int n1, int n2) {
10             return n1 + n2;
11         }
12     };
13      
14     public abstract int evel(int n1, int n2);
15 }

 

同时,使用枚举实现单例模式,可以实现单例模式,并且可以防止通过反射和序列化方式破解单例

 

1 public enum Singleton {
2     INSTANCE;
3  
4     public void method1() {
5         System.out.println("hello");
6     }
7 }
分享到:
评论

相关推荐

    java枚举实例代码

    Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...

    Java枚举类型Enum的用法

    Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...

    java枚举类型说明

    ### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...

    简单总结java枚举类型

    Java枚举类型是Java语言中一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的方式来表示一组有限的值。枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用...

    java枚举状态机

    Java枚举(Enum)状态机是一种使用枚举类型来实现状态转换逻辑的编程技术,它在Java编程中被广泛应用于管理对象的状态变化。状态机是一种模型,用于描述一个系统或对象在不同时间点可能存在的状态以及如何从一个状态...

    java枚举结果类、根据状态值获取枚举值

    java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” </#list>

    java枚举类用法

    Java枚举类型(enum)是Java语言中一种特殊的类,用于定义一组固定的常量。它在许多场景下作为替代常量或单例模式的选择,提供了更安全、更易读的代码。下面我们将深入探讨Java枚举类的用法及其优势。 1. **枚举的...

    高阶Java-Java枚举类型 enum 应用详解

    本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用它们。 一、枚举的基本用法 1. 声明枚举类型: ```java public enum Color { RED, GREEN, BLUE } ``` 在这里,`Color`是枚举类型,`RED`, `...

    理解java枚举类型

    Java枚举类型是Java语言中的一种特殊的类,用于定义一组固定的常量集合。它在Java中扮演着重要的角色,提供了一种安全、类型化的常量表示方式,比传统的final static变量更具有优势。理解Java枚举类型对于编写高质量...

    列举java 枚举相关信息

    ### Java 枚举类型详解 #### 一、引言 ...通过以上的介绍,我们可以看到Java枚举类型不仅提供了类型安全的保障,还为开发者带来了极大的灵活性。合理地使用枚举类型,可以显著提高代码的质量和可维护性。

    Java枚举类型.pdf

    在本文中,我们将深入探讨Java枚举的定义、使用方法以及它如何改善传统使用`static final`常量的模式。 首先,让我们看看传统的`static final`常量表示枚举的方式。例如,清单1展示了如何使用`public static final`...

    java枚举的一个实例

    Java枚举是编程语言Java中的一个特色特性,它在类、接口和变量的定义中扮演着特殊的角色。枚举在Java中被用作一种数据类型,用于定义一组固定的常量,这些常量可以代表特定的值或状态。通过枚举,我们可以确保变量...

    如何使用Java枚举类型

    一个关于JAVA枚举类型的MHT文件,包含JAVA枚举类型的用法,以及JDK版本的问题。

    java枚举ppt和详细代码

    Java枚举是面向对象编程中的一个重要特性,它用于定义固定的常量集合,这些常量通常代表某种特定的数据类型。在Java中,枚举提供了一种更安全、更规范的方式来处理常量,相比于传统的final static变量,枚举具有更多...

    Java枚举与设计模式

    本文详尽地论述了Java枚举与设计模式的关系

    java枚举,以及自己总结的两个示例.xmind

    如有侵权请联系删除,欢迎批评指正 java枚举,起初在网上抄了一部分,然后自己加了点示例,做一个记录,也算是为以后留个备份,技术小白一个,还在努力成长

    java枚举类的属性、方法和构造方法应用实战

    Java 枚举类的属性、方法和构造方法应用实战 Java 枚举类是一种特殊的类,它拥有自己的属性、方法和构造方法。本文将详细介绍 Java 枚举类的属性、方法和构造方法应用实战,结合实例形式分析了 Java 枚举类的定义、...

    JAVA枚举类型的用法详解

    下面我们将深入探讨Java枚举类型的常见用法。 首先,枚举类型在本质上等同于定义了一组静态常量。创建枚举类型的语法如下: ```java public enum Belle { para1, para2, para3, para4; } ``` 这会创建一个名为`...

    深入理解 Java 枚举(枚举的方法+枚举的特性+枚举可以实现接口+组织枚举+策略枚举+枚举工具类等)

    深入理解 Java 枚举 Java 枚举是 Java 语言中的一种特殊类型,自 JDK 5 开始引入,使用 enum 关键字修饰。在 Java 中,枚举是一种受限制的类,具有自己的方法。枚举的本质是 java.lang.Enum 的子类,它提供了一些...

    全面掌握java枚举类型(enum-type)1

    全面掌握 Java 枚举类型(enum type) Java 枚举类型是一种特殊的数据类型,它可以取有限个数的明确值。枚举类型的引入解决了 int 枚举模式和 String 枚举模式的缺点,提供了类型安全性、可读性和性能等优势。 ...

Global site tag (gtag.js) - Google Analytics