前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >枚举enum基本特性

枚举enum基本特性

作者头像
栋先生
发布2018-09-29 17:00:40
4940
发布2018-09-29 17:00:40
举报
文章被收录于专栏:Java成长之路Java成长之路

enum(枚举)是Java se5中添加的一个新特性,是指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值。枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量。

一、基本特性

创建Enum时,编译器会为你生成一个相关的类,这个类继承自Java.lang.Enum。下面例子演示了Enum的一些功能:

代码语言:javascript
复制
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.print(s.compareTo(Shrubbery.CRAWLING) + " ");
      System.out.print(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);
    }
  }
}

Output: Output: GROUND ordinal: 0 -1 false false class Shrubbery GROUND ———— CRAWLING ordinal: 1 0 true true class Shrubbery CRAWLING ———— HANGING ordinal: 2 1 false false class Shrubbery HANGING ———— HANGING CRAWLING GROUND

Enum常用方法介绍:

  1. enum会自动创建toString()和name()方法,以便可以方便的显示某个enum实例的名字;
  2. enum还会创建ordinal()方法,用来表示某个特定enum常量的声明顺序,从0开始;
  3. enum创建了static values()方法,用来按照enum常量的声明顺序,产生这些常量值构成的数组。
  4. valueOf()是在Enum中定义的static方法,它根据给定的名字返回相应的enum实例,如果不存在给你名字的实例,将会抛出异常。
  5. 可以使用==来比较enum实例,编译器自动为你提供了equals和hashcode方法。
  6. Enum类实现了Comparable接口,所以它具有compareTo()方法。

将静态导入用于enum

使用static import可以将enum实例的标识符导入当前的命名空间,所以无需再用enum类型来修饰enum实例。

二、向enum中添加新方法

除了不能继承enum类,我们基本上可以把enum看作一个常规的类。也就是说,我们可以往enum中添加方法。 一般来说,我们可能希望enum中包含更多信息,如对于自身的描述等。为此,我们可以通过一个构造器,专门负责处理这个额外的信息,然后添加一个方法,返回这个描述信息。如下所示:

代码语言:javascript
复制
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:
  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());
  }
} /* Output:
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
*///:~

覆盖enum的方法

复写toString()方法,给我们提供了另一种方式来为枚举实例生成不同的字符串描述信息。如下所示:

代码语言:javascript
复制
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);
    }
  }
} /* Output:
Scout
Cargo
Transport
Cruiser
Battleship
Mothership
*///:~

toString()方法通过调用name()方法取得SpaceShip()的名字,然后将其修改为只有首字母大写的格式。

三、switch语句中的enum

在switch中使用enum,是enum提供的一项非常便利的功能。下面代码使用enum构造了一个小型状态机:

代码语言:javascript
复制
// 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();
    }
  }
} /* Output:
The traffic light is RED
The traffic light is GREEN
The traffic light is YELLOW
The traffic light is RED
The traffic light is GREEN
The traffic light is YELLOW
The traffic light is RED
*///:~
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年07月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、基本特性
    • 将静态导入用于enum
    • 二、向enum中添加新方法
      • 覆盖enum的方法
      • 三、switch语句中的enum
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档