Java 之枚举类

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

在早期,可能会直接使用简单的静态常量来表示枚举类,例如:

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

这种定义简单明了,但会存在一些问题:

  1. 类型不安全:因为会把一个季节当成一个int整数使用,例如进行加法运算。
  2. 没有命名空间:比如SEASON前缀,否则会与其他混淆。
  3. 打印输出的意义不明确:比如输出SEASON_SPRING,实际上输出的是1。

但枚举又确实有存在的意义,因此早期也可采用通过定义类的方式来实现。

  1. 通过private将构造器隐藏起来。
  2. 把这个类的所有可能实例都使用public static final修饰的类变量来保存。
  3. 如果有必要,可以提供一些静态方法,允许其他程序根据参数来获取与之匹配的实例。
  4. 使用枚举类可以使程序更加健壮,避免创建对象的随意性。

但通过定义类来实现枚举的代码量比较大,实现起来也比较麻烦,Java从JDK1.5后就增加了对枚举类的支持。

入门:

Java5新增了一个enum关键字(它与class、interface关键字的地位相同),用以定义枚举类,枚举类是一种特殊的类,它一样可以有自已的成员变量、方法,可以实现一个或者多个接口,也可以定义自已的构造器。一个Java源文件中最多只能定义一个public访问权限的枚举类,且名称也要相同。

但枚举类终究不是普通类,它与普通类有如下区别:

  1. 枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable接口。
  2. 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。
  3. 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰,如果强制指定访问控制符,则只能指定private修饰。
  4. 枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不能产生实例。列出这些实例,系统会自动添加public static final修饰。

枚举类默认提供了一个values()方法,该方法可以很方便地遍历所有的枚举值。

枚举类的实例只能是枚举值,而不是随意地通过new来创建枚举类对象

时间: 2024-10-18 17:19:58

Java 之枚举类的相关文章

JAVA学习--枚举类的使用

* 一.枚举类  * 1.如何自定义枚举类  * 2.如何使用enum关键字定义枚举类  *     >常用的方法:values() valueOf(String name)  *     >如何让枚举类实现接口:可以让不同的枚举类的对象调用被重写的抽象方法,执行的效果不同.(相当于让每个对象重写抽象方法) 1 //普通枚举类 2 class Season{ 3 //1.提供类的属性,声明为private final 4 private final String seasonName; 5 p

Effective Java之枚举类

随着Effective Java这本书看的越来越多,发现在平时使用Java时犯了很多明显的错误,自己平时知道一点但缺少使用的也越来越多. 关于枚举类,书中的建议是用枚举类替代传统的静态常量,平时,如果一类数据用不同的数值表示,我正常的做法是写一串const static常量来表示,但看了这本书后发现,这样的表示方法虽然可以达到自己的目的,但是存在一些隐患,比如类型安全,还有,在使用上述方法区分不同的类型时,某一个具体的类型中的方法是在外面用过判断然后调用的,在这种情况下,代码就变得不是很漂亮.

疯狂java笔记-枚举类

1 //手动实现枚举类 2 //步骤 3 1.通过private将构造器隐藏起来 4 2.把这个类的所有可能的实例都使用public static final修饰的类变量来保存 5 3.如果有必要,可以提供一些静态方法,允许其他程序根据特定的参数来获取与之匹配的实例 6 public class Season{ 7 //把Season类定义成不可变的,将其Field也定义成final 8 private final String name; 9 private final String desc

Java之枚举类的基本用法

创建枚举类 package com.ywlaker.enums; /** * @功能描述:季节枚举类 * @author yang.wei * @time 2015年9月1日 上午11:56:23 * @version 0.0.1 */ public enum Season { SPRING("春天","spring"), SUMMER("夏天","summer"), AUTUMN("秋天","a

Java之枚举类

有时候,变量的取值只在一个有限的集合内. 例如:pizza的大小只有小.中.大和超大这四种尺寸.当然,可以将这些尺寸分别编码为1.2.3.4或者S.M.L.X.但这样存在着一定的隐患.在变量中很有可能保存的是一个错误的值(如0和m). 针对这种情况,可以自定义枚举类型.枚举类型包括有限个命名的值.例如, enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE}; 现在,可以声明这种类型的变量: Size s = Size.MEDIUM; Size类型的变量只能存储到这个

Java一个枚举类的2种实现。

实现方式一: public enum Operation { PLUS, MINUS, TIMES, DIVIDE; double apply(double x, double y) { switch (this) { case PLUS: return x + y; case MINUS: return x - y; case TIMES: return x * y; case DIVIDE: return x / y; } throw new AssertionError("Unknow o

Java:枚举类enum

http://blog.csdn.net/qq_31655965/article/details/55049192 http://blog.csdn.net/qq_27093465/article/details/52180865 原文地址:https://www.cnblogs.com/huiAlex/p/8338283.html

java enum 枚举类

图一代码: public enum LogMethodEnum { WEBCSCARDVALID("返回值"), WEBCSVERIFYPASSWORD("返回值"), WEBCSSAVEPASSWORD("返回值"), WEBCSSETPASSWORD("返回值"), WEBCSQUERYTOTALBALANCE("返回值"), WEBCSQUERYCARDDETAIL("返回值"),

java 枚举类 enum 总结

枚举定义: enum是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把这些量说明为整型, 字符型或其它类型显然是不妥当的.为此,C语言提供了一种称为“枚举”的类型.在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变 量取值不能超过定义的范围.应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型. java中枚举类总