文章目录

  • 枚举类
    • 1. 使用静态常量表示枚举
    • 2. 通过定义类的方式表达枚举
    • 3. 枚举类
    • 4. 枚举类实现接口
      • 每个枚举实例实现自己的方法
    • 5. 包含抽象方法的枚举类

枚举类

在某些情况下,一个类的对象是有限而且固定的,比如季节类,他只有四个对象。
这种实例有限而且固定的类,在java 中被称为枚举类。

1. 使用静态常量表示枚举

public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER = 2;
public static final int SEASON_FALL = 3;
public static final int SEASON_WINTER = 4;

这样虽然简单,但存在几个问题

  • 类型不安全:每个季节实际上是一个 int 整数,因此完全可以把一个季节当成 一个 int 整数使用,例如进行加法运算 SEASON_SPRING+SEASON_SUMMER ,这样的代码完全正常,但逻辑是不通的,季节怎么能相加呢。
  • 没有命名空间:当需要使用季节时,必须在 SPRING 前 使用 SEASON 前缀,否则程序可能与其他类的静态常量混淆。
  • 输出的意义不明确:当输出 SEASON_SPRING,实际上输出的是1,很难猜测到他代表了春天。

2. 通过定义类的方式表达枚举

  • 通过private 将构造器隐藏起来。
  • 将该类的所有可能实例都使用 public static final 修饰的类变量来保存。
  • 如果需要,可以提供一些静态方法,允许其他程序根据特定参数来获取与之匹配的实例。
  • 使用枚举类可以使程序更加健壮、避免创建对象的随意性。
public class Season {public static final Season SPRING = new Season(1, "spring");public static final Season SUMMER = new Season(2, "summer");public static final Season FALL = new Season(3, "fall");public static final Season WINTER = new Season(4, "winter");private final int code;private final String message;private Season(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}
}
public class Test {public static void main(String[] args) {System.out.println(Season.SPRING.getCode());System.out.println(Season.SPRING.getMessage());}
}

经过这样处理,之前的问题就解决了。
但问题又来了。
上面的枚举简单,但功能也简单,当需求增加的时候,代码量会很多。比如有遍历出所有枚举实例的需求等等。

3. 枚举类

  • 枚举类可以实现一个或多个接口,使用enum 定义的枚举类默认继承了 java.lang.Enum 类,而不是默认继承 Object 类,因此枚举类不能显式继承其他父类。 其中 java.lang.Enum 类实现了 java.lang.Serializable 和 java.lang.Conparable 两个接口。
  • 使用 enum 定义、非抽象的枚举类默认会使用 final 修饰。
  • 枚举类的构造器只能使用 private 修饰,如果省略,默认使用。由于枚举类的所有构造器都是 private 的,而子类构造器总是要调用父类构造器一次,因此枚举类不能派生子类。
  • 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加 public static final 修饰,无须程序员显示添加。

java.lang.Enum 类中提供了如下几个方法。

  • int compareTo(E o):该方法用于与指定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例进行比较。如果该枚举对象位于指定枚举对象之后,则返回正整数;如果该枚举对象位于指定枚举对象之前,则返回负整数,否则返回零。
  • String name():返回此枚举实例的名称,这个名称就是定义枚举类时列出的所有枚举值之一。与此方法相比,大多程序员应该优先考虑使用 toString()方法,因为 toString()方法返回更加友好的名称。
  • int ordinal():返回枚举值在枚举类中的索引值(就是枚举值在枚举声明中的位置,第一个枚举值的索引值为零)
  • String toString():返回枚举常量的名称,与name 方法相似,但 toString()方法更常用。
public enum SeasonEnum {SPRING(1, "spring"),SUMMER(2, "summer"),FALL(3, "fall"),WINTER(4,"winter");private final int code;private final String message;SeasonEnum(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}
}
public class Test {public static void main(String[] args) {System.out.println(SeasonEnum.SPRING.getCode());System.out.println(SeasonEnum.SPRING.getMessage());System.out.println("-------------------------------");SeasonEnum summer = SeasonEnum.valueOf("SUMMER");System.out.println(summer.getMessage());System.out.println(summer.name());System.out.println(summer.toString());System.out.println(summer.ordinal());System.out.println("-------------------------------");for (SeasonEnum season: SeasonEnum.values()) {System.out.println(season.getMessage());System.out.println(season.name());System.out.println(season.toString());System.out.println(season.ordinal());System.out.println("-------------------------------");}}
}

建议将枚举类的成员变量都使用 private final 修饰。

4. 枚举类实现接口

枚举类也可以实现一个或多个接口,与普通类是一样的。

定义一个接口

public interface Info {void praise();
}
public enum SeasonEnum implements Info{SPRING(1, "spring"),SUMMER(2, "summer"),FALL(3, "fall"),WINTER(4,"winter");private final int code;private final String message;SeasonEnum(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}@Overridepublic void praise() {System.out.println("天地定位,山泽通气,雷风相薄,水火不相射");}
}
public static void main(String[] args) {for (SeasonEnum season : SeasonEnum.values()) {season.praise();}}

每个枚举实例实现自己的方法

public enum SeasonEnum implements Info{SPRING(1, "spring") {@Overridepublic void praise() {System.out.println("春宵一刻值千金,花有清香月有阴。");}},SUMMER(2, "summer") {@Overridepublic void praise() {System.out.println("连雨不知春去,一晴方觉夏深");}},FALL(3, "fall") {@Overridepublic void praise() {super.praise();}},WINTER(4,"winter") {@Overridepublic void praise() {System.out.println("北国风光,千里冰封,万里雪飘");}};private final int code;private final String message;SeasonEnum(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}@Overridepublic void praise() {System.out.println("天地定位,山泽通气,雷风相薄,水火不相射");}
}

5. 包含抽象方法的枚举类

注意:并不是所有的枚举类都使用 了 final 修饰!非抽象的枚举类才默认使用 final 修饰。对于一个抽象的枚举类而言,只要他包含了抽象方法,他就是抽象枚举类,系统会默认使用 abstract 修饰,而不是使用 final 修饰。

public enum SeasonEnum {SPRING(1, "spring") {@Overridepublic void praise() {System.out.println("春宵一刻值千金,花有清香月有阴。");}},SUMMER(2, "summer") {@Overridepublic void praise() {System.out.println("连雨不知春去,一晴方觉夏深");}},FALL(3, "fall") {@Overridepublic void praise() {System.out.println("一声梧叶一声秋,一点芭蕉一点愁,三更归梦三更后。");}},WINTER(4,"winter") {@Overridepublic void praise() {System.out.println("北国风光,千里冰封,万里雪飘");}};private final int code;private final String message;SeasonEnum(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}public abstract void praise();
}

秋天的赞美必须有:

enum 1.0 java 枚举类相关推荐

  1. java 枚举类型enum ppt,关于JAVA枚举类使用的异常

    当前位置:我的异常网» J2SE » 关于JAVA枚举类使用的异常 关于JAVA枚举类使用的异常 www.myexceptions.net  网友分享于:2013-01-24  浏览:5次 关于JAV ...

  2. java枚举类Enum入门理解

    目录 枚举的定义 JDK5.0之前只能自定义枚举类 自定义枚举类的理解: JDK5.0之后enum关键字定义枚举类 区别于自定义枚举类 enum的父类Enum的常用方法 toString方法和valu ...

  3. 比起睡觉,我更喜欢刷巨详细的Java枚举类,这是来自猿人的自觉呀

    零基础学习之Java枚举类 概述 JDK1.5之前 创建枚举类 代码示例 JDK1.5之后 创建枚举类 代码示例 枚举类继承父类 基本介绍 代码示例 枚举类实现接口 基本介绍 代码示例 枚举类实现单例 ...

  4. 学妹问我Java枚举类与注解,我直接用这个搞定她!

    很多人问我学妹长什么样,不多说 上图吧! 学妹问我Java枚举类与注解,我直接一篇文章搞定! 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举 ...

  5. Java枚举类与注解——一篇文章读懂枚举类与注解

    文章目录 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举类实现接口 二.注解 ① 生成文档相关注解 ②注解在编译时进行格式检查 ③注解跟踪代 ...

  6. Java枚举类使用方式

    Java枚举类使用方式 单枚举定义 : /*** * @title: 单枚举定义* @author: wll* @since: 2021-1-27 14:47:54*/ public enum Jud ...

  7. java枚举类中字段有没有必要加final____枚举类字段 Field ‘xxx‘ may be ‘final‘

    java枚举类中字段有没有必要加final 今天在写一个系统统一返回码的枚举类时候,突然想到一个问题,当不小心手抖给枚举类自动生成了set方法,而恰巧在用的地方不小心用了set方法,从而修改了code ...

  8. JAVA 枚举类的初步理解

    JAVA 枚举类的初步理解 现在Java的枚举类在真实项目中已经用的比较频繁,比静态常量更好用,也更有限定性,enum类可以用来表示有限的类对象,比如星期.月份.性别或者项目中的产品类型 像诸如此类的 ...

  9. java 枚举类组合在一起_Java,.NET,但为什么在一起?

    java 枚举类组合在一起 十二年前,Sun微系统公司大张旗鼓地宣布了一种新的编程语言和环境,用于使网页更具动态性和"活力". 当然,现在,Java编程语言是一种无处不在的工具,它 ...

最新文章

  1. Unity2017.1官方UGUI文档翻译——Scrollbar
  2. Flink从入门到精通100篇(二十四)-对Flink SQL Client 源码做深度解析
  3. oracle删除所有触发器的命令,Oracle删除当前用户的所有对象(表、视图、触发器、存储过程、函数)...
  4. 服务器物理内存总是九十几,服务器物理内存使用率90以上
  5. 我是如何晋升专家岗的
  6. tensorflow随机梯度下降算法使用滑动平均模型
  7. 直接获取Program Files目录的API
  8. php套壳_PHP-T
  9. 超市管理系统软件测试用例图,《天天超市管理系统》所有模块测试用例集.doc...
  10. linux怎么安装台式无线网卡,linux下安装无线网卡
  11. Computer:编程入门的简介相关的一些概念解释之详细攻略
  12. 微软拼音输入法自定义短语
  13. 施密特将辞任Alphabet执行董事长 转任技术顾问 | 聚焦
  14. 进程同步机制四大基本准则
  15. Win10 盘符更改后需要修改的
  16. 非常全面的NFS文档(FOR LINUX)
  17. 微信小程序页面之间传参,发表说说
  18. eSpace VTM Solution在金融信贷领域的应用开发
  19. Linux系统编程 74 孤儿进程和僵尸进程
  20. 传统支付方式不能满足线下支付的需求

热门文章

  1. weui-master中的lrz实现移动端图片文件压缩(参:localResizeIMG4)
  2. C# DateTime.Now.ToString() 用法
  3. 将烧录过的SD卡磁盘分区合并并格式化
  4. MyBatis增强器——Mybatis-Plus
  5. Git创建远程分支并提交代码到远程分支
  6. Cesium快速上手1-CesiumWidget-Scene结构
  7. ip8plus多重_多项“黑科技”让行车操作更简单,瑞虎8 PLUS究竟带了多少诚意?
  8. 使用IDEA创建Java项目
  9. 经验指导:全国信息学竞赛(NOI)之成功诀窍
  10. 第一篇:更多腰间盘突出的几大点!