枚举

将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用;

枚举基本特性

以下代码是枚举的简单使用:

使用values方法返回enum实例的数组

使用ordinal方法返回每个enum实例的次序,从0开始

使用compareTo方法比较两个enum实例

使用==来比较enum实例

使用getDeclaringClass方法返回enum实例所属的enum类

使用valueOf方法根据指定的名字返回enum实例

package enumerated;

enum Shrubbery {
GROUND, CRAWLING, HANGING
} public class EnumClass {
public static void main(String[] args) {
for (Shrubbery s : Shrubbery.values()) {
System.out.println(s + " ordinal: " + s.ordinal());
System.out.println(s.compareTo(Shrubbery.CRAWLING) + " ");
System.out.println(s.equals(Shrubbery.CRAWLING) + " ");
System.out.println(s == Shrubbery.CRAWLING);
System.out.println(s.getDeclaringClass());
System.out.println(s.name());
System.out.println("----------------------");
}
// Produce an enum value from a string name:
for (String s : "HANGING CRAWLING GROUND".split(" ")) {
Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);
System.out.println(shrub);
}
}
}

注意枚举enum默认是继承自java.lang.Enum类的,在以上代码中,Shrubber为一个枚举类, GROUND, CRAWLING, HANGING为这个enum类的实例,由于Shrubber已经继承自java.lang.Enum类,所以它是不能在继承其它enum类的;

另外,在使用枚举的时候,可以考虑使用静态导入枚举类型,省去使用枚举类型修饰枚举实例;

向enum中添加方法

enum基本上是可以被看做一个常规的类,可以向其添加方法,甚至main方法;

如下代码,在枚举类内部添加一个构造方法和getDescription方法, 注意,当定义自己方法的时候,需要在enum实例序列的最后一个后面添加分号,且要先定义enum实例再定义方法;

package enumerated;

public enum OzWitch {
// Instances must be defined first, before methods:
WEST("Miss Gulch, aka the Wicked Witch of the West"),
NORTH("Glinda, the Good Witch of the North"),
EAST("Wicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy's house"),
SOUTH("Good by inference, but missing");
private String description; // Constructor must be package or private access:
private OzWitch(String description) {
this.description = description;
} public String getDescription() {
return description;
} public static void main(String[] args) {
for (OzWitch witch : OzWitch.values())
System.out.println(witch + ": " + witch.getDescription());
}
}

再看一个例子,覆盖Enum类的方法,如下代码,覆盖toString方法,将枚举的name首字母大写,其余转为小写,:

package enumerated;

public enum SpaceShip {
SCOUT, CARGO, TRANSPORT, CRUISER, BATTLESHIP, MOTHERSHIP;
public String toString() {
String id = name();
String lower = id.substring(1).toLowerCase();
return id.charAt(0) + lower;
} public static void main(String[] args) {
for (SpaceShip s : values()) {
System.out.println(s);
}
}
}

在switch中使用枚举

如下代码是枚举在switch语句中的使用,注意在case语句里,枚举实例前面是不需要写上枚举类型的,强行写上(如Signal.RED)编译器会报错;

package enumerated;

// Define an enum type:
enum Signal {
GREEN, YELLOW, RED,
} public class TrafficLight {
Signal color = Signal.RED; public void change() {
switch (color) {
// Note that you don't have to say Signal.RED
// in the case statement:
case RED:
color = Signal.GREEN;
break;
case GREEN:
color = Signal.YELLOW;
break;
case YELLOW:
color = Signal.RED;
break;
}
} public String toString() {
return "The traffic light is " + color;
} public static void main(String[] args) {
TrafficLight t = new TrafficLight();
for (int i = 0; i < 7; i++) {
System.out.println(t);
t.change();
}
}
}

关于枚举中的values()方法

我们已经知道枚举类是继承java.lang.Enum类的,但是查看Enum源代码却没有发现有values()方法,那么values()方法是哪里来的呢?

答案是,values()方法是由编译器添加的静态方法,有兴趣可以利用反射机制去查看,如上面的例子,可以编写如下代码查看:

Method[] methods = Signal.class.getMethods();

其它补充

看一个例子就好,如下:

基本可以把枚举当成一个类来使用;

//Color继承自Enum
public enum Color { //Color实例
RED("Red"),
YELLOW("Yellow"),
//Color实例,继承自Color
BLUE("Blue") {
@Override
public String getDescription() {
//调用父类的test方法,BLUE实例是继承自Color的
super.test();
return super.getDescription();
}
//重写父类Color的toString方法
@Override
public String toString() {
return "蓝色";
}
}; private String description; private Color(String description) {
this.description = description;
} public String getDescription() {
return description;
} //重写父类Enum的toString方法
@Override
public String toString() {
return this.description;
} public void test() {
System.out.println("hi~");
} public static void main(String[] args) {
//调用Color.BLUE实例的getDescription方法
Color.BLUE.getDescription(); //Color.RED是Color的一个实例,Color继承自Enum
Enum<Color> red = Color.RED;
System.out.println(red);//调用Color的toString //调用Color.BLUE的toString
System.out.println(Color.BLUE); }
}

参考资料:JAVA编程思想--4

JAVA中的枚举小结的更多相关文章

  1. 【译】Java中的枚举

    前言 译文链接:http://www.programcreek.com/2014/01/java-enum-examples/ Java中的枚举跟其它普通类很像,在其内部包含了一堆预先定义好的对象集合 ...

  2. Java中的枚举类型详解

    枚举类型介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义 ...

  3. 扒一扒: Java 中的枚举

    目录 1. 枚举的定义 1.1 传统的非枚举方法 1.2 枚举方法 1.3 定义总结 2 枚举的本质 2.1 继承 java.lang.Enum 2.2 final 类型 2.3 枚举常量本身就是该类 ...

  4. 全面解读Java中的枚举类型enum的使用

    这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...

  5. 用好Java中的枚举真的没有那么简单

    1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承j ...

  6. 说说Java中的枚举(一)

    在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的.例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”. ...

  7. Android笔记:java 中的枚举

    部分数据使用枚举比较方便,java中的enmu不如c#中使用方便 记录备忘 以c#中的代码为例 public enum PlayState { /// <summary> /// 关闭 / ...

  8. Java中Enum枚举的使用

    三种不同的用法 注意项: 1.在switch中使用枚举能使代码的可读性更强.   2.如果要自定义方法,那么必须在enum实例序列的最后添加分号.而且Java要求必须先定义enum实例.   3.所有 ...

  9. Java中的枚举的治理

    版权声明:本文为博主原创文章,转载请注明出处,欢迎使劲喷 一.为啥用枚举&为啥要对枚举进行治理 1.先来说说为啥用枚举 表中某个字段标识了这条记录的状态,我们往往使用一些code值来标识,例如 ...

随机推荐

  1. ms sql 2005和2008收缩日志的方法

    步骤1: 2005的sql 语句为:back up log 数据库名称 with no_log 目的:截断数据库日志 2008的sql 语句为:alter database 数据库名称 set rec ...

  2. Scala确实是门好语言

    看完了一本Scala的书,整体感觉很不错,语法很简洁,对用惯了脚本语言的人来说语言特性稍微有点复杂,不过对Java用户应该没有压力. 最牛叉的有两点:并发.面向领域编程    

  3. java Servlet(续)

    一.web.xml配置 由于需用户需要通过URL访问架设好的Servlet,所以我们必须将servlet映射到一个URL地址上, 比如上面的配置文件我们就可以通过:http://localhost:8 ...

  4. 第 28 章 CSS3 多列布局

    学习要点: 1.早期多列问题 2.属性及版本 3.属性解释 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 提供的多列布局,通过多列布局我们方便的创建流体的多列布局. 一.早期多列问题 我们 ...

  5. C#代码实现对HTTP POST参数进行排序

    private static string GetSortedParas(Dictionary<string, string> dic) { dic = dic.OrderBy(key = ...

  6. [翻译]Autofac 解析服务

    注册组件以后,通过容器或 ILifetimeScope 的 Resolve 方法解析服务: var builder = new ContainerBuilder(); builder.Register ...

  7. 【转】PHP计划任务:如何使用Linux的Crontab执行PHP脚本

    转:https://www.centos.bz/2011/03/auto-run-task-crontab/ 我们的PHP程序有时候需要定时执行,我们可以使用ignore_user_abort函数或是 ...

  8. 赞!带进度条的 jQuery 文件拖放上传插件

    jQuery File Uploader 是一个 jQuery 文件拖放上传插件,包括 Ajax 上传和进度条效果.作者编写这个插件的想法是要保持它非常简单,不像其他的插件,很多的标记,并提供一些 H ...

  9. FancySelect – 更好用的 jQuery 下拉选择框插件

    FancySelect 这款插件是 Web 开发中下拉框功能的一个更好的选择.FancySelect 使用方便,只要绑定页面上的任何 Select 元素,并调用就 .fancySelect() 就可以 ...

  10. jQuery的document ready与 onload事件——你真的思考过吗?

    在进行实验和资料查询时,我遇到了几个关键问题: 1. window.onload到底是什么加载完触发? 2. body为什么会有onload事件? 3. 为什么是window.onload,而不是do ...