Java's enum
2014-03-02 11:26 Duke's 阅读(147) 评论(0) 收藏 举报1.为枚举创建整数模式
为了声明颜色枚举,需要声明如下int模式:
public static final int COLOR_VIOLET = 0; public static final int COLOR_INDIGO = 1; public static final int COLOR_BLUE = 0;
使用这类Int模式会带来很多问题。首先
他们不是类型安全的。在需要使用一种彩虹颜色时,可以传入任何int值。
更糟的是,可以对这些颜色进行数学运算,而这显然是没有任何意义的。
其次,为了避免与应用程序中的其他常量冲突,需要在他们的名称前面添加前缀,所有以上代码使用了COLOR前缀。
再次,这种枚举类型很脆弱,因为他们是在客户端编译的。如果以后修改了他们的顺序或者添加了新的常量,就需要重新编译客户端,否则客户端的行为将无法预料。
最后,如果在程序中打印出这些常量,得到的将是整数值,从这些值无法获知他们代表的含义和他们的类型。
2.JSE5.0引入了enum类型
package com.dzu.enums; /** * 列举一种中的天数 * * @author Administrator * */ public class WeekDaysList { public static void main(String[] args) { System.out.println("Days of week:"); for (DaysOfTheWeek day : DaysOfTheWeek.values()) { System.out.printf("%s ", day); } System.out.println(); } } enum DaysOfTheWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; @Override public String toString() { // only capitalize the first letter String s = super.toString(); return s.substring(0, 1) + s.substring(1).toLowerCase(); } }
3.向枚举中添加属性
enum类只有一个受保护的构造函数,并且不能由程序员调用。
package com.dzu.enums; /** * 向枚举中添加自定义属性 * * @author Administrator * */ enum Apple { AURORA(10), BELMAC(12), CORTLAND(15), EMPIRE(8), GRAVENSTEIN(11); private int price; Apple(int price) { this.price = price; } int getPrice() { return price; } } public class AppleEnum { public static void main(String[] args) { System.out.println("Apple price list:"); for (Apple apple : Apple.values()) { System.out .println(apple + " costs " + apple.getPrice() + " cents."); } } }
4.将方法附加到枚举常量
package com.dzu.enums; /** * 将方法附加到枚举常量 * * @author Administrator * */ public class UnitsConverter { public static double numberToConvert = 0; public static void main(String[] args) { if (args.length == 0) { System.out.println("Usgae: java UnitsConverter <weight in pounds>"); System.exit(0); } numberToConvert = Double.parseDouble(args[0]); System.out.println("lbs " + args[0] + " equals:\n"); for (Converter conv : Converter.values()) { System.out.printf("%s: %f%n", conv, conv.performConversion(numberToConvert)); } } } /* * 每当在Converter枚举中添加新的常量时,就需要提供performConversion方法的实现,因为该 * 方法在Converter枚举中被声明为抽象方法。这使得枚举定义简单易用。 */ enum Converter { KG("KG") { double performConversion(double f) { return f *= 0.45359237; } }, CARTA("carat") { double performConversion(double f) { return f *= 2267.96185; } }, GMS("gms") { double performConversion(double f) { return f *= 453.59237; } }, OUNCE("ounce") { double performConversion(double f) { return f *= 16; } }, STONE("stone") { double performConversion(double f) { return f *= 0.071428571429; } }; private final String symbol; Converter(String symbol) { this.symbol = symbol; } @Override public String toString() { return symbol; } abstract double performConversion(double f); }
5.序列化enum类型
package com.dzu.enums; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * 序列化枚举常量 * * @author Administrator * */ public class EnumSerialization { public static void main(String[] args) { ColorPalette drawingColor = ColorPalette.GREEN; try { System.out.println("Saving color setting"); ObjectOutputStream outStream = new ObjectOutputStream( new FileOutputStream("Settings.dat")); outStream.writeObject(drawingColor); outStream.close(); ObjectInputStream inputStream = new ObjectInputStream( new FileInputStream("Settings.dat")); System.out.println("Retrieved object: " + (ColorPalette) inputStream.readObject()); inputStream.close(); } catch (IOException e) { System.out.println("Error reading/writing object"); } catch (ClassNotFoundException e) { System.out.println("Class casting error"); } } } /* * 调色板枚举类 */ enum ColorPalette { RED, GREEN, BLUE }
浙公网安备 33010602011771号