有时候,变量的取值只在一个有限的集合内。

例如:pizza的大小只有小、中、大和超大这四种尺寸。当然,可以将这些尺寸分别编码为1、2、3、4或者S、M、L、X。但这样存在着一定的隐患。在变量中很有可能保存的是一个错误的值(如0和m)。

针对这种情况,可以自定义枚举类型。枚举类型包括有限个命名的值。例如,

enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};

现在,可以声明这种类型的变量:

Size s = Size.MEDIUM;

Size类型的变量只能存储到这个类型声明中给定的某个枚举值,或者null值,null表示这个变量没有设置任何值。

下面是他的完整代码加运行结果:

package enums;

import java.util.Scanner;

/**
* 详解请看:Java核心技术(原书第十版)p188-189
* @author 大凌轩
*
*/
public class EnumTest { public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.print("Enter a size:(SMALL,MEDIUM,LARGE,EXTRA_LARGE)");
String input=in.next().toUpperCase(); //这里解释下此处toUpperCase方法,就是将你键盘输入的字母格式化为大写,下面有运行图
Size size=Enum.valueOf(Size.class, input);
System.out.println("size="+size);
System.out.println("abbreviation="+size.getAbbreviation());
if(size==Size.EXTRA_LARGE)
System.out.println("Good job--you paid attention to the _.");
}
} enum Size{
SMALL("S"),MEDIUM("M"),LAREG("L"),EXTRA_LARGE("XL"); private Size(String abbreviation){this.abbreviation=abbreviation;}
public String getAbbreviation(){return abbreviation;} private String abbreviation;
}

下面为了自己以后方便理解,对其进行详细解释:

public enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};

实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。

因此,在比较两个枚举类型的值时,永远不要调用equals,而直接使用“= =”就可以了。

如果需要的话,可以在枚举类型中添加一些构造器、方法和域。当然,构造器只是在构造枚举常量的时候被调用。小面是一个示例:

public enum Size{
SMALL("S"),MEDIUM("M"),LARGE("L"),EXTRA_LARGE("XL"); private String abbreviation; private Size(String abbreviation){this.abbreviation=abbreviation;}
public String getAbbreviation(){return abbreviation;}
}

所有的枚举类型都是Enum类的子类。它们继承了这个类的许多方法。其中最有用的一个是toString,这个方法能够返回枚举常量名。例如,Size.SMALL.toString()将返回字符串“SMALL”。

toString的逆方法是静态方法valueOf。例如,语句:

Size s = Enum.valueOf(Size.class,"SMALL");

将s设置成Size.SMALL。

每个枚举类型都有一个静态的values方法,它将返回一个包含全部枚举值的数组。例如,如下调用

Size[] values = Size.values();

返回包含元素Size.SMALL,Size.MEDIUM,Size.LARGE,Size.EXTRA_LARGE的数组。

ordinal方法返回enum声明中枚举常量的位置,位置从0开始计数。例如:Size.MEDIUM.ordinal()返回1。

代码其实是最能体现出知识内容的载体,上面的解释其实起不到太大的作用,你读懂了代码,也就知道个八九不离十了。

以上是我看《Core Java Volume I-Fundamentals》第十版的笔记

关于枚举的实现细节和原理也可参考《ThinkingInJava》第四版:http://blog.lichengwu.cn/java/2011/09/26/the-usage-of-enum-in-java/

Java之枚举类的更多相关文章

  1. Java学习——枚举类

    Java学习——枚举类 摘要:本文主要介绍了Java的枚举类. 部分内容来自以下博客: https://www.cnblogs.com/sister/p/4700702.html https://bl ...

  2. Java笔记---枚举类和注解

    Java笔记---枚举类和注解 一.枚举类 自定义枚举类 方式一:JDK5.0之前自定义枚举类 class Seasons { //1. 声明Seasons对象的属性 private final St ...

  3. 【Java】 枚举类

    如果要定义一个枚举类: public enum Size { SAMLL, MEDIUM, LARGE, EXTRA, EXTRA_LARGE}; 实际上,这个声明定义的类型是一个类,它刚好有4个实例 ...

  4. java中枚举类的实际应用

    知识点:在Java中,使用枚举类,当遇到实例类型有限的类时,并且数据库中用状态码代表一种含义时,如星期,性别,员工登陆某系统的状态等等, 可以考虑使用枚举类 本例子可以仿照,也可以使用自定义的类型处理 ...

  5. Java:枚举类也就这么回事

    目录 一.前言 二.源自一道面试题 三.枚举的由来 四.枚举的定义形式 五.Enum类里有啥? 1.唯一的构造器 2.重要的方法们 3.凭空出现的values()方法 六.反编译枚举类 七.枚举类实现 ...

  6. java基础---枚举类与注解

    一.枚举类 类的对象只有有限个,确定的.我们称此类为枚举类 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. 定义枚举类 方式一:jdk5.0之前,自定义枚举类 public class Se ...

  7. 【Java】枚举类

    文章目录 枚举类的使用 如何定义枚举类 方式一:jdk5.0之前,自定义枚举类 方式二:jdk5.0,可以使用enum关键字定义枚举类 Enum类的主要方法 toString() values() v ...

  8. java中枚举类的使用详解

    /* * 通过JDK5提供的枚举来做枚举类 */ public enum Direction2 { FRONT("前"), BEHIND("后"), LEFT( ...

  9. Java Enum 枚举类的values方法

    Enum类和enum关键字定义的类型都有values方法,但是点进去会发现找不到这个方法.这是因为java编译器在编译这个类(enum关键字定义的类默认继承java.lang.Enum)的时候 自动插 ...

随机推荐

  1. 他被称为"中国第一程序员",微软得不到他曾想毁了他,如今拜入武当修道

    GitHub 15.4k Star 的Java工程师成神之路,不来了解一下吗! GitHub 15.4k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 15.4k Star ...

  2. JavaWeb网上图书商城完整项目--BaseServlet

    1.以前进行操作的时候,例如我们进行登陆操作我们使用LoginServlet进行处理,进行注册操作我们使用RegisterServlet,很多业务的操作的时候我们就要定义很多个Servlet 有了Ba ...

  3. 《HelloGitHub》第 51 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  4. caffe的python接口学习(6)用训练好的模型caffemodel分类新图片

    经过前面两篇博文的学习,我们已经训练好了一个caffemodel模型,并生成了一个deploy.prototxt文件,现在我们就利用这两个文件来对一个新的图片进行分类预测. 我们从mnist数据集的t ...

  5. 手把手教你把web应用丢到服务器上(单页应用+ 服务端渲染)

    前两篇文章中,我分别介绍了框架的搭建利用vue-cli + vant搭建一个移动端开发模板,并且把项目中axios请求和vuex的用法做了简要的介绍如何在项目里管理好axios请求与vuex.在这两篇 ...

  6. java语言基础(四)_面向对象_类_对象_封装_构造

    面向对象 Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计.开发计算机程序. 这里的对象泛指现实中一切事物,每种事物都具备 ...

  7. 记一次解密wireshark抓取的冰蝎通信流量

    一.关于冰蝎 1.1 简单介绍 冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端.老牌 Webshell 管理神器——中国菜刀的攻击流量特征明显,容易被各类安全设备检测,实际场 ...

  8. CSS如何将图像转换为模糊图像?

    在CSS中,可以使用filter属性来模糊处理图像:filter属性用于将图像转换为模糊图像.该属性主要用于设置图像的视觉效果. 语法: filter: blur() 属性值: ● blur():给图 ...

  9. css完美解决网页在iphoneX的头部刘海显示问题

    一.解决iphonX白条,网站扩展到整个屏幕 网页在iphoneX的浏览器屏幕显示上,默认情况下在头部的2侧会出现白条背景,网站被限制在了一个“安全区域”内,移除白色背景的方法 方法一:设置body的 ...

  10. 51Nod 1534 棋子游戏 题解

    题目 波雷卡普和瓦西里喜欢简单的逻辑游戏.今天他们玩了一个游戏,这个游戏在一个很大的棋盘上进行,他们每个人有一个棋子.他们轮流移动自己的棋子,波雷卡普先开始.每一步移动中,波雷卡普可以将他的棋子从(x ...