@tsing1226
2016-10-13T11:57:11.000000Z
字数 4294
阅读 1098
java
用 enum 关键字加上名称和大括号包含起来的枚举值体。比如:
enum RainbowColor {RED,ORANGE,YELLOW,GREEN,CYAN,BLUE,PURPLE}
引入枚举类型最大的好处就是扩大switch语句使用范围。
//定义一周七天的枚举类型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;}
// 定义 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;}}
使用时主要事项:
。
// 定义一个一周七天的枚举类型package example.enumeration.codes;public enum WeekDayEnum {Mon(1), Tue(2), Wed(3), Thu(4), Fri(5), Sat(6), Sun(7);private int index;WeekDayEnum(int idx) {this.index = idx;}public int getIndex() {return index;}}// 客户端程序,将一个枚举值通过网络传递给服务器端package example.enumeration.codes;import java.io.IOException;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.net.InetSocketAddress;import java.net.Socket;import java.net.UnknownHostException;public class EnumerationClient {public static void main(String... args) throws UnknownHostException, IOException {Socket socket = new Socket();// 建立到服务器端的连接socket.connect(new InetSocketAddress("127.0.0.1", 8999));// 从连接中得到输出流OutputStream os = socket.getOutputStream();ObjectOutputStream oos = new ObjectOutputStream(os);// 将星期五这个枚举值传递给服务器端oos.writeObject(WeekDayEnum.Fri);oos.close();os.close();socket.close();}}// 服务器端程序,将从客户端收到的枚举值应用到逻辑处理中package example.enumeration.codes;import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class EnumerationServer {public static void main(String... args) throws IOException, ClassNotFoundException {ServerSocket server = new ServerSocket(8999);// 建立服务器端的网络连接侦听Socket socket = server.accept();// 从连接中获取输入流InputStream is = socket.getInputStream();ObjectInputStream ois = new ObjectInputStream(is);// 读出客户端传递来的枚举值WeekDayEnum day = (WeekDayEnum) ois.readObject();// 用值比较方式来对比枚举对象if (day == WeekDayEnum.Fri) {System.out.println("client Friday enum value is same as server's");} else if (day.equals(WeekDayEnum.Fri)) {System.out.println("client Friday enum value is equal to server's");} else {System.out.println("client Friday enum value is not same as server's");}// 用 switch 方式来比较枚举对象switch (day) {case Mon:System.out.println("Do Monday work");break;case Tue:System.out.println("Do Tuesday work");break;case Wed:System.out.println("Do Wednesday work");break;case Thu:System.out.println("Do Thursday work");break;case Fri:System.out.println("Do Friday work");break;case Sat:System.out.println("Do Saturday work");break;case Sun:System.out.println("Do Sunday work");break;default:System.out.println("I don't know which is day");break;}ois.close();is.close();socket.close();}}
两个工具类两个工具类:EnumSet 和 EnumMap
enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
你能够在每周七天日期中进行迭代,EnumSet 类提供一个静态方法 range 让迭代很容易完成
for(WeekDayEnum day : EnumSet.range(WeekDayEnum.Mon, WeekDayEnum.Fri)) {System.out.println(day);}
输出结果:
MonTueWedThuFri
EnumSet 还提供了很多个类型安全的获取子集的 of 方法,使你很容易取得子集
EnumSet<WeekDayEnum> subset = EnumSet.of(WeekDayEnum.Mon, WeekDayEnum.Wed);for (WeekDayEnum day : subset) {System.out.println(day);}
输出结果:
MonWed
与 EnumSet 类似,EnumMap 也是一个高性能的 Map 接口实现,用来管理使用枚举类型作为 keys 的映射表,内部是通过数组方式来实现。EnumMap 将丰富的和安全的 Map 接口与数组快速访问结合到一起,如果你希望要将一个枚举类型映射到一个值,你应该使用 EnumMap。看下面的例子:
// 定义一个 EnumMap 对象,映射表主键是日期枚举类型,值是颜色枚举类型private static Map<WeekDayEnum, RainbowColor> schema =new EnumMap<WeekDayEnum, RainbowColor>(WeekDayEnum.class);static{// 将一周的每一天与彩虹的某一种色彩映射起来for (int i = 0; i < WeekDayEnum.values().length; i++) {schema.put(WeekDayEnum.values()[i], RainbowColor.values()[i]);}}System.out.println("What is the lucky color today?");System.out.println("It's " + schema.get(WeekDayEnum.Sat));
输出结果:
What is the lucky color today?It's BLUE