代码改变世界

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
}