【Java】enum

昨天在做besuper的小型交互游戏的时候,强默默走到我边上,然后看了一眼我的代码,又一如既往的开始喷我:你这写的啥玩意儿啊!这么多类常量定义在前面,干嘛创建一个枚举类型!也就是因为这样被喷的经历,让我今天下决心好好了解一下enum的用法。


优势

为什么在有些时候我们要用枚举呢?所以先看看枚举常量和我们经常使用的类常量、实例常量比较,有什么优势。

  1. 枚举常量更加简单
    在接口中定义类常量,如下:
interface Season {
    int Spring = 0;
    int Summer = 1;
    int Autumn = 2;
    int Winter = 3;
}

在枚举中定义常量

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER;
}

枚举只需要定义每一个枚举项(其实每个枚举项就是一个枚举类型的实例对象),不需要定义枚举值,而接口常量(即类常量)则必须初始化,否则编译不通过。两个引用方式相同(类名.属性),但是枚举表示的是一个枚举项,字面量就是SPRING、SUMMER、AUTUMN、WINTER,而接口常量字面量是一个int类型:0、1、2、3。

  1. 枚举常量属于稳定型
    如果我们使用一个接口常量,我们就必须要对输入值进行检查,确定是否越界,如果常量非常庞大,校验输入就是一件非常麻烦的事情,但是这个过程又无法避免。
public void describe(int s) {
  if (s >= 0 && s <= 4) {
    switch(s) {
      case Season.Summer:
        System.out.println("Summer is very hot!");
        break;
      case Season.Winter:
        System.out.println("Winter is very cold!");
        break;
    }
  }
}

如果是枚举常量,我们看看它是怎么避开校验的。

public void describe(Season s) {
  switch(s) {
     case Season.Summer:
        System.out.println("Summer is very hot!");
        break;
      case Season.Winter:
        System.out.println("Winter is very cold!");
        break;
  }
}

因为我们已经限定了输入的参数只能是Season枚举,所以只能输入Season的四个实例。这也是枚举很好的一个作用:在编译期间限定类型,不允许发生越界的情况。

  1. 枚举具有内置方法
    每个枚举都是java.lang.Enum的子类。该基类提供了很多方法:获得排序值得ordinal(),compareTo()等。比如列出所有的枚举值:
public static void main(String[] args) {
  for (Season s : Season.value()) {
    System.out.println(s);
  }
}
  1. 枚举可以自定义方法
    这一点看上去不是枚举的优点,因为在定义类常量所在的类里面也可以定义方法,但是枚举在可以定义静态方法和实例方法的基础之上,还可以从根本上杜绝枚举常量在别的类中被实例化(因为枚举的构造方法默认是private的,所以只允许在枚举中实例化,不允许在别的地方进行实例化。这也是枚举的意义之一!)。
    枚举实现:
enum Season {
  SPRING, SUMMER, AUTUMN, WINTER;

  public static Season getComfortableSeason() {
    return SPRING;
  }
}

类实现:

class Season {
    public final static int Spring = 0;
    public final static int Summer = 1;
    public final static int Autumn = 2;
    public final static int Winter = 3;

  public static void int getComfortableSeason() {
    return Spring;
  }
}
  1. 虽然枚举在很多方面都比接口常量和类常量做得好,但是有一点它比不上接口常量和类常量,就是继承。因为枚举是不能被继承的,也就是说一个枚举常量定义之后,除非修改重构,否则无法做扩展。但是,我们依旧要用枚举常量替代接口常量或者类常量

枚举常量一个很关键的用法

先定义一个枚举类

enum Season {
  SPRING, SUMMER, AUTUMN, WINTER;
  }
}

再定义一个类

public class chooseSeason {
  String s = "spring";
  Season season = Season.valueOf(s.toUpperCase());
  switch (season) {
    case SPRING :
      System.out.println("这是春天");
    case SUMMER:
      System.out.println("这是夏天");
    case AUTUMN:
      System.out.println("这是秋天");
    case WINTER:
      System.out.println("这是冬天");
  }
}

这里,我们是想把一个常量传入switch,然后进行一个选择。这里我们运用了枚举的第一个特点,就是switch()里面的参数类型定死为Season枚举类型了。但是,如果我们得到的数据是一个字符串,我们想把这个字符串的字面量当做switch的条件传入怎么办呢?这个时候,我们把字符串变成大写,并通过Enum里面的valueOf()方法,把字符串转成枚举常量。并且这个枚举常量的字面量就是原来字符串的字面量。

这样的转换在switch里面真的好用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 背景 在 Java 语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组 int 常量。定义如下: 这种...
    yyxyz2011阅读 1,487评论 0 2
  • Enum 有时候变量的取值只有在一个有限的集合内。例如服装的尺码只有大、中、小和超大这四种尺寸。针对这种情况就可以...
    狮_子歌歌阅读 5,584评论 1 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了...
    Java红茶阅读 628评论 0 4
  • 最近在寻觅亲子游的旅行套餐,感觉特别费劲。不是时间不合适,就是价格不合适,多半是时间不合适。因为浏览的网站APP都...
    茉莉大大阅读 120评论 0 0