Enum 类型

枚举类型(Enumerated Type)被用来将一组类似的值包含到一种类型当中。而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似。不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围。

 

如何定义 Enum 类型

 

枚举类型的定义也非常的简单,用 enum 关键字加上名称和大括号包含起来的枚举值体即可,彩虹颜色就可以用新的 enum 方式来重新定义:

 enumRainbowColor { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE }

枚举类型不仅是简单地将整形数值转换成对象,而是将枚举类型定义转变成一个完整功能的类定义。这种类型定义的扩展允许开发者给枚举类型增加任何方法和属性,也可以实现任意的接口。另外,Java 平台也为 Enum 类型提供了高质量的实现,比如默认实现 Comparable 和 Serializable 接口,让开发者一般情况下不用关心这些细节。

一个最直接的益处就是扩大 switch 语句使用范围。

清单 2. 定义 Enum 类型

 // 定义一周七天的枚举类型                 

 public enum WeekDayEnum { Mon, Tue, Wed, Thu,Fri, Sat, Sun }

 

 // 读取当天的信息

 WeekDayEnum today = readToday();

 

 // 根据日期来选择进行活动

 switch(today) {

 Mon: do something; break;

 Tue: do something; break;

 Wed: do something; break;

 Thu: do something; break;

 Fri: do something; break;

 Sat: play sports game; break;

 Sun: have a rest; break;

 }

如何定制 Enum 类型

 

除了以上这种最常见的枚举定义形式外,如果需要给枚举类型增加一些复杂功能,也可以通过类似 class 的定义来给枚举进行定制。比如要给 enum 类型增加属性,可以像下面这样定义:

清单 3. 定制枚举类型

 // 定义 RSS(Really Simple Syndication) 种子的枚举类型

 public enum NewsRSSFeedEnum {

   // 雅虎头条新闻 RSS 种子

   YAHOO_TOP_STORIES("http://rss.news.yahoo.com/rss/topstories"),

   

   //CBS 头条新闻 RSS 种子

   CBS_TOP_STORIES("http://feeds.cbsnews.com/CBSNewsMain?format=xml"),

   

   // 洛杉矶时报头条新闻 RSS 种子

   LATIMES_TOP_STORIES("http://feeds.latimes.com/latimes/news?format=xml");

       

   // 枚举对象的 RSS 地址的属性

   private String rss_url;

       

   // 枚举对象构造函数

   private NewsRSSFeedEnum(String rss) {

       this.rss_url = rss;

    }

       

   // 枚举对象获取 RSS 地址的方法

   public String getRssURL() {

       return this.rss_url;

    }

 }

上面头条新闻的枚举类型增加了一个 RSS 地址的属性 , 记录头条新闻的访问地址。同时,需要外部传入 RSS 访问地址的值,因而需要定义一个构造函数来初始化此属性。另外,还需要向外提供方法来读取 RSS 地址。

 

如何避免错误使用 Enum

 

不过在使用 Enum 时候有几个地方需要注意:

1.       enum 类型不支持 public 和protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。

2.       定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号';'隔开,不能用逗号或空格。

3.       由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值